v2.1.9.1 2011-06-08
===================
BUG FIXES: 
- The check for duplicated TMs did not work if a sitename did not exist in the TM.
  We added now a warning for missing sitenames.
  Thanks to Folder for reporting the issue and to Strikles for finding the bug.
  [THF]
- CFormula: Reading formula file: mistakenly verified if formula exist 
  when supposed to verify if handlist exists.
  [TripleSeven]
- Frame recording in "its my turn" mode did not record with autoplayer off. Fixed it
  and made sure only one frame gets saved for each turn [JF].
- Autoplayer action for allinmethod 1 and 2 was not setting frame recording flag. 
  [JF]
- Replayframes on my turn did get now taken on exactly the same heartbeat 
  where the autoplayer acts. Thanky to VitaliKK2005 for providing the patch.
  [THF]
  
NEW STUFF:
- TM-symbol "handnumber" is now optionally ranged between s$handnumber_min_expected_digits 
  and s$handnumber_max_expected_digits to reduce the risk of handresets by occlusion.
  s$handnumber_min_expected_digits and s$handnumber_max_expected_digits can now 
  be set in the tablemap.
  [TripleSeven]
- PT3-support for more sites:
  * betfair
  * cryptologic
  * ultimate
  * absolute
  * wpex
  * tribeca
  * merge
  * winamax
  * everleaf
  * yatahay
  Thanks to SteveG1963 and Strikles for providing the code. 
  [THF]
  
MAINTENANCE:
- Removing formula symbol "handnumber" for various reasons from the formula level:
    * there is no need for it at the formula level.
    * it may contain characters and therefore doesn't fit into a double.
    * its length may exceed the precision of double.
  "Handnumber" gets now used only internally to trigger handresets. 
  This work gets now done in a new class CHandResetDetector.
  [THF]
- Removing tablepoints completely, as they were never implemented completely
  and there is no need for it.
  http://www.maxinmontreal.com/forums/viewtopic.php?f=117&t=12444
  [THF]
- Enabling autoplayer-trace per default to reduce "problem" reports by newbies.
  [THF]
- Improving some rules of the validator.
  Thanks to Nik0 for identifying some critical ones.
  [THF]


v2.1.9 2011-02-20
=================
BUG FIXES: 
- Tablepoints got handled incorrectly by the auto-connector.
  This took some time to get detected, as they get rarely used.
  Thanks to Vasyatko for reporting the bug and for providing
  replay-frames to reproduce the problem. 
  [JumpingFences]
- The Formula dialog did not highlight all PT-symbols.
  Thanks to Qwerty for submitting the patch. 
  [THF]
- "Random" didn't get calculated each time new, but only once per heartbeat,
  contrary to the docu. This has now been fixed. Additionally a symbol
  "randomheartbeat" got introduced. Thanks to StangelNator for reporting. 
  [THF]
- There was no delay between multiple button-clicks (like "max" and "raise" to go allin),
  which caused problems on some casinos. This has now been fixed. There also is a 
  new auto-player-option "click-delay" to configure the timing.
  Thanks to Querty who submitted the patch. 
  [THF]
- Epsilon-expressions caused crashes inside brackets.
  We fixed it by completely disallowing empty expressions inside other expressions.
  Only standard formulas, that don't get used are allowed to stay empty.
  Thanks to BrassKnuckles for reporting the problem. 
  [THF]
- Scraper-DLL: Some variables got ignored when changed by the scraper-DLL
  (e.g. "limit"), as limit_found didn't get affected. This has now been changed.
  Thanks to Ljmj for submitting the patch. 
  [THF]
- There was a memory-overflow when too many memory-symbols got used and OH could crash.
  We do now prevent this, throw an error and stop the autoplayer.
  Thanks to Stangelnator for reporting the bug and providing useful info. 
  [THF]
- The autoplayer-trace did get logged only for the default allinmethod (0 = swag),
  but not for 1 and 2. This got now fixed. Thanks to Gonhilda and CrumbleSunday for reporting. 
  [THF]


v2.1.8 2011-01-15
=================
BUG FIXES:
- OH tried to get the symbol "scraperprocessordll" from the tablemap
  instead of "scraperdll". Thanks to Vasyatko and Want2Learn for reporting. [THF]
- The formula editor was handling unsaved formulas in several different ways (inconsistently).
  [JumpingFences]
- The action constants for prevaction were no longer consistent to WinHoldem
  due to code improvements. Thanks to Qwerty for reporting. [THF]
- srankbits, srankbitspoker, srankhipoker, etc. were returning incorrect
  results due to missing brackets in an arithmetic expression.
  This has now been fixed. [JumpingFences]
- OH tried to read the complete function into the fixed-sized space for the functions name
  and then truncate it. This caused a buffer oberflow in case of large functions.
  Thanks to KaeKruse for reprting the bug and providing a formula to reproduce it. [THF]
- There were some typos in the symbol names used by the validator.
  This caused false positives. Thanks to MasterNet for reporting. [THF]
- Betround was undefined after disconnecting from a table,
  but still used as part of an assertion. This caused a warning in debug-mode and got now fixed.
  [JumpingFences]
- Added a missing Sleep() to the autoplayer-code between two clicks for the new allin-method.
  Without it clicking max, then raise didn't work at some casinos.
  Thanks to Poker_Dog for reporting and to Qwerty for submittina a patch. [THF]
- icm_fold could be wrong, because we assumed the pot is splitted
  between non folded opponents. This is a bug, current bets should not be splitted, 
  but only the common pot. The bets of folded players should be given back. [Spud]


v2.1.7 2010-09-12
=================
BUG FIXES:
- Fixed broken title of replay-frames, which has to be in the first line as plain text
  (which is not standard HTML, but good old WinHoldem design).
  Thanks to qwerty for reporting the problem and to Poker_Dog 
  for pointing out the mistake. [THF]
- Default for user-dll (preferences.dll_name) is no longer "user.dll", but "".
  Setting the string to "user.dll" whenever it was empty
  caused problems for the people who wanted to have it undefined:
  http://www.maxinmontreal.com/forums/viewtopic.php?f=112&t=11556
  Thanks to JumpingFences for pointing out the problem. [THF]
- OpenHoldem was loading some DLLs using absolute paths.
  This was breaking standard windows behaviour:
  http://msdn.microsoft.com/en-us/library/ms682586(VS.85).aspx
  Thanks to JumpingFences for pointing out the problem and his detailed explanations. [THF]
- OpenHoldem crashed in optimized release-mode after using the formula editor
  very late at termination of the program, as a string object got accessed
  that had already been released. Thanks to JumpingFences for fixing the bug
  and to BillW for testing and confirming the fix. [THF]
- The symbol "playersblindbits" was incorrectly assuming, that always the next two chairs 
  after the dealer were the blinds. This has now been fixed.
  Thanks to Mjoe2 for reporting the problem [Strikles]
- Some casinos (currently we are only aware of FullTilt) use a "dead button", 
  if one of the blinds did bust in the previous hand.
  This caused problems with the code to detect blinds and with the ICM symbols.
  Thanks to CrumbleSunday for reporting the issue and for Poker_Dog 
  for contributing to the solution. [Strikles]
- Fixed a memory leak in the formula editor. 
  Thanks to JumpingFences for reporting the problem and fixing the bug. [THF]


v2.1.6 2010-08-29
=================
BUG FIXES:
- The symbol "call" got broken by a previous bug-fix.
  Thanks to kTrader for reporting. [Strikles]
- Trying to adapt the history-symbols after an action did break
  some other symbols like currentbetX. 
  Thanks to BadHabit for reporting. [Strikles]
- Detecting the blinds was a bit unreliable
  ("blinds" means blind-posters here, not bet.amounts),
  as OpenHoldem assumed, that always the two seats after the button are blinds,
  even if they were empty. This has now been corrected.
  Special care has been taken for situations that are headsup or become headsup.
  Thanks to Mjoe2 for reporting this old problem again and providing a good screenshot 
  that motivated us to do the fix. [Strikles]

MAINTENANCE:
- Now also logging f$delay (optionally). [THF]
- Some minor improvements to the replay-frames (HTML-file). [THF]  

v2.1.5 2010-07-01
=================
BUG FIXES:
- The symbol ishistraight did not work for all best straights,
  but only for ace-high-straights. This has now been fixed.
  Thanks to Mad4IT for reporting. [Strikles]
- betround was used for symbol lookups when loading the first formula,
  but not yet initialized. 
  This was pretty harmless, but threw an assertion in debug-mode. 
  Thanks to Gecko for motivating me to fix it. [THF]
- OpenHoldem was not able to use both absolute and relative filenames
  to load scraper(preprocessor)-DLLs. Thanks to Ljmj
  for reporting the problem and for providing the fix. [THF] 
- Applying a formula while the autoplayer is engaged is an extremely bad idea
  (PEBKAC) and could lose the whole formula. Trying to fix this issue
  (stupid user) with improved warning messages. Nothing more we can do. [THF] 
- Fixed yet another problem with nopponentsraising. [Strikles]
- Historically all hi_symbols (and some others) keep the value they had 
  at heros last turn in betting round X, as heros turn is the only time
  when we get stable frames, so scraping or even guessing what happened behind hero
  would be completely unreliable. 
  However some other symbols like nbetsroundX get now adapted for heros action,
  assuming that his action gets executed correctly.
  Thanks to Gecko for "motivating" me to fix this "bug". [THF]
- Comments inside handlists got overwritten when the editor-dialog
  changed a handlist. This has now been changed.
  Thanks to Trom for reporting. [THF]
- The autoplayer trace did not work for f$allin. This has now been fixed.
  Thanks to CrumbleSunday for reporting. 
  Temporarily the autoplayer-trace for f$play, f$rebuy (but not the primary functions)
  will be written every heartbeat, but that will easily be resolved 
  with some other changes in the upcoming OH 2.2.0 [THF] 


v2.1.4 2010-04-23
=================
BUG FIXES:
- Fixing a copy-and-paste-error in CFormula.cpp.
  Thanks to Bibi34 for reporting. [THF]
- Adding some forgotten code to the message-map.
  Thanks to Vlad2048 for reporting. [Spew]
- Fix for autoconnector-problems with manual connection
  and exactly 1 non-served table left.
  Thanks to Mad4it for reporting and helping to find the bug. [THF] 
- Syntax highlighting now for *all* symbols.
  Thanks to Sturmzealot for reporting. [THF]
- Removing unnecessary check for i3button in swag-code,
  which did prevent using the normal raise-button for swag.
  Thanks to BillW for pointing out the problem 
  and for doing some research on Rays original design. [THF]

NEW STUFF:
- Configuration-checks:
  * Font-smoothing
  * Windows theme
  * testing for correct installation of Perl
  * testing, if PATH-variable contains Perl-directory
  * better test for MSVCRT 8.0, which is necessary for Perl. 
  [Strikles]

v2.1.3 2010-03-03
=================
BUG FIXES:
- Fixing last known memory leak in CTablemap.
  Thanks to Gabber2k for providing the fix. [THF]
- Fixing index problem in CSymbols,
  incorrectly testing two times the same card:
  "if (player_card_cur[0]==CARD_NOCARD || player_card_cur[0]==CARD_NOCARD)"
  Thanks to Bibi34 for finding the bug.
- CTableLimits: taking care of special cases like 0.02/0.05/0.10 and
  0.05/0.15/0.39 [Ganadai and THF]


v2.1.2 2010.02.12
=================
BUG FIXES:
- Several bug-fixes and improvements to the new class CTableLimits,
  that detects and auto-locks blind-values. Thanks to Nomade, Skyzzo and 
  Winngy for their help with testing and replay-frames. [THF]
- Warnings when parsing files with duplicate formulae or handlists.[THF]


v2.1.1 2010-01-30
=================
BUG FIXES:
- Re-enabled the ability to disable autoplayer after it has been engaged.  This was mistakenly removed in the 2.1.0 release.
  [OpenHoldem]
- Max_Logsize got set incorrectly in the preferences dialog. That has now been fixed. [THF]
- The logfile did sometimes not get opened correctly due to mis-placed brackets
  in the feature to control the size of the log-file. This has now been fixed. [THF]
- Rebuy did only work when autoplayer-actions took place, but not, when heros balance fell to zero.
  Calling the rebuy-function has now been moved from auto-player to the heartbeat-cycle. [THF]
- Some people reported incorrect duplicate actions, when the action was very fast.
  To avoid this we do now reset the counter for stable frames after autoplayer-actions,
  as we expect some changes to appear. [THF]
- The auto-connector did treat tablemaps with min/max-clientsize incorrectly.
  Thanks to Nomade for finding the bug and providing the fix. [THF]
- Detecting blind-values correctly is an errorprone task, especially when scraping it from the table.
  There could be cases, where somebody raises and SB folds and the blinds do suddenly double-up.
  This has now been improved by auto-locking the blinds
  * for the current hands, as soon as the values are reasonable
  * for the entire session after N hands (cashgame only).
  Still needs further work, as the input from the scraper-engine seems to be quite dissatisfactory,
  at least when testing at PokerAcademy, but that may be related to missing stable frames.
  Thanks to Nomade for providing replay-frames to reproduce the problem. [THF]

NEW STUFF:
- Additional checks for incorrect system configurations,
  like keyboard settings and correctly installed libraries. 
  As a default the checks are enabled for newbies,
  but the not so critical ones can be disabled by experienced users. [THF]

  
v2.1.0 2010-12-26        
=================
NEW STUFF:
- Added option to delete old log-files that exceed a given size. [THF]
- Removed the old WinHoldem-default-bot. Replaced it with Playbot by Matrix. [THF]
- Improvements to the user interface of the Script dialog. [Spew]
- Added "Apply and Save" to the formula dialog with CTRL-S as the shortcut. [Spew]
- New TM symbol allinmethod.
    0: swag the balance (default)
    1: click max (or allin), then raise
    2: click only max (or allin) [Spew and THF]
- New versus symbols to get probabilities of winning/losing versus opponent hands
  that are better (resp. worse or equal) than our hand now
    vs$nhandshinow   vs$nhandstinow   vs$nhandslonow
    vs$prwinhinow    vs$prtiehinow    vs$prloshinow
    vs$prwintinow    vs$prtietinow    vs$prlostinow
    vs$prwinlonow    vs$prtielonow    vs$prloslonow [Spud]
- Ability to control external rebuy-scripts. 
  Please refer to the docu for more information. [THF]
- Auto-connector: OH is now able to connect automatically to a new table without 
  any human interaction. Please refer to the docu for more information. [THF]
- TM setting to force the user chair on connection (forcechair = x) [Spew]
- Added handling of WMA_DODISCONNECT and WMA_CONNECTEDHWND messages (in addition to existing WMA_DOCONNECT 
  message).  WMA_CONNECTEDHWND can be used to 'query' a given OpenHoldem instance to see if it is connected to
  a window or not.  This is primarily useful for automation in hoppers.  Sample code in the docu.
  WMA_DODISCONNECT will disconnect OH from an attached window
  WMA_CONNECTEDHWND will return the handle of the window that OH is attached to, zero otherwise [OpenHoldem]  
- Added handling of new value for the "potmethod" symbol, "3".  potmethod=3, 
  treats c0pot0-c0pot9 not as main pot/side pots, but rather as a way to find the best total pot.  
  The scraper engine will scrape all of c0pot0-c0pot9 and set the "pot" symbol to the highest scraped value.  
  Kind thanks to spud from Lab 1.  [OH]
- Added a new capability extension called "scraperpre".  
  Some casinos have started displaying unusual information in various regions that do not have an obvious way 
  to be handled with the current OH design, other than scraper override.  
  One casino, for example, displays pots like this "150 + (300)".  "150" is the amount that is committed to the pot 
  in previous rounds, and "+ (300)" is the amount that has been bet by players so far in this round.  
  Scraper override is intended to be used with DLL injection or chat box parsing techniques, 
  and what is needed here is a way to massage the transform engine's output before it gets converted internally 
  into consumable numbers. "scraperpre" works just like other user-extensible DLLs.  
  It is different from scraper override, in that the string types that come out of the transform engine are passed 
  to the DLL, rather than the final resultant types (doubles).  This makes the interface very straightforward.  
  The scraper engine will pass transformed strings to a user-coded DLL, the DLL can do whatever massaging is necessary, 
  and then the engine will continue with what the DLL passes back for further processing.  
  In the above example, the scraperpre DLL could be used to simply strip everything off of the scraped pot string 
  after + or (.  The engine would then get "150" back, which would then be processed into the correct double type. [OpenHoldem]

BUG FIXES:
- The new callbits and raisbits code had an index-problem.
  Thanks to Skyzzo and Ganadai for reporting. [THF]
- The mh_str_quads did put invalid string to the IsHand()-function.
  Thanks to Lavezzi for reporting and to Loose_Passive for finding the bug. [THF]


v2.0.4 2009-12-01
=================
BUG FIXES:
- Fixed display of log$ information in the main window. [Spew]
- OpenHoldem did treat negative titles and negative radii incorrectly,
  when trying to connect to a table. [THF]
- Raisbits, foldbits and callbits didn't work (again).
  That code has now been moved from CGamestate to CSymbols
  and the info gets calculated as part of the "playersraising"-info,
  which is known to be working and pretty robust. [THF]
- Chat did not work (again). Got fixed, but the code is a bit messy. [THF]
- Keyboard.dll: As suggested by "aandryunin" we do now Sleep() before sending any input (and still after).
  We hope, that improves the swag-problems. [THF].


v2.0.3 2009-10-23
==============
BUG FIXES:
- When the autolayer was engaged it was still possible to load a new formula via
  the MRU-list.
  This usually crashed the evaluator-engine, which had to operate on invalid data. [THF]
- The symbol "elapsed" got reset a second time when the user-chair was detected 
  (or the user-chair was forced). So it could be smaller than "elapsedhand"
  and"elapsedauto",
  which both got only initialized once, when OH connected to a table, which
  caused validator-errors.
  We removed that second reset of "elapsed" to avoid that issue.
  This modification doesn't really change the nature of "elapsed", which measures the
  session-length,
  as in practise the userchair gets detected very soon after the connection to a table.[THF]
- Error-message on unknown symbols. This feature did also detect some typos in rules
  for the validator, which have been fixed now. [THF]
- OpenHoldem did first start the IteratorThread and then mark it as running.
  This was the source of an ugly race-condition; for low NITs the iteratorthread
  could already be finished when it got marked as running. This killed the iterator in
  future heartbeat-cycles. We swapped now the two instructions. Thanks to SuperTramp
  for finding the problem and suggesting the fix. [THF]
- User.DLL: Callback-pointer for custom chat-messages was missing. 
  Thanks to poker_dog for reporting.[THF]
- Some symbols like nplayersdealt, dealtbits and dealposition were very sensitive to fast folds.
  We do now consider players as dealt, if they are active (e.g. sitting in).
  Strictly speaking this is not really correct (e.g. a player could be sitting out and come back),
  but that is a case, that happens less frequently than fast folds in early position. [THF]
- OpenHoldem and OHReplay use now 6-digit-numbers for replayframes. [THF]
- Fixed typo in CMyHand::StrengthStraight(void). Thanks to SamFisher for reporting it. [THF]
- OpenHoldem does now convert s$sitename and s$network internally to lower-cases.
  The old behaviour was not really a bug, but caused some confusions for PokerTracker-users. [THF]
- Some positional symbols were conservatively only calculated, when the userchair was confirmed,
  although they didn't depend on that information. This has now been fixed. [THF]
- PT3-support for Cake and Bodog. Thanks to Serax for reporting the new sites and providing the code. [THF]   


v2.0.2 2009-09-01
==============
BUG FIXES:
- blinds and antes got not set correctly when scraped from the table 
  instead of read from the titlebar. Thanks to epo for finding and fixing the bug. [THF]
- nopponentscalling: OH did incorrectly start searching for calling players at the first player after the button,
  which caused problems, when players in early position coldcalled or raised.
  We do now start at the first player with non-zero balance after the last known aggressor,
  take him as the "oldest" bettor and then do a circular search for callers. [THF]
- handresetmethod did confuse HANDRESET_HANDNUM and HANDRESET_CARDS.
  Thanks to Brdhse1 for providing the fix. [THF]
- Fixed TM-image-problem introduced by rev. 810. Thanks to Brdhse1 and Tompalainen
  for reporting it. [THF]
- Fixed main memory leak in CTablemap.cpp. Some mystrious 44-byte-blocks remain. [THF]
- Fix: Confused IsEqual and IsGreaterOrEqual when fixing the rounding-error in rule 0069.
  Thanks to PoundSand for reporting it. [THF] 
- maxbalance was sometime lower than balance. Thanks to PoundSand for reporting it. [THF]
- Validator: Fixed a typo in rule 0504, that required to see a call button, when there was a check-button. [THF]
- Validator: Fixed incorrect assumption about the range of vs$nhands. [THF]
- Support for five new casinos, which got added by PokerTracker. OH supports now
   * PokerStars
   * Party
   * Full Tilt
   * iPoker
   * Everest
   * OnGame
   * Boss Media
   * Cereus Network
   * Pacific Poker
   * Entraction
   * MicroGaming [THF]

v2.0.1 2009-07-17
=================
BUG FIXES:
- PokerPro-message 'TLCK' not supported due to missing documentation. Tournament-players will need to use the old
  Poker-Pro-server (2007). Messagebox will give a hint. [THF]
- OH didn't read c0smallblind and c0bigblind correctly when parsing tablemaps. Thanks to Epo for reporting. [THF]
- Fixed some memory-leaks. [THF]
- raischair and ac_aggressor were wrong, when a player in late raised and another one in early position coldcalled.
  OH does now search for the highest bet starting from the last known raiser instead of the SB. [THF]
- OH used direct floating-point-comparisons, which could create strange results due to rounding-errors.
  Created functions to replace the compare-operators (== != <= >= < >). E.g.
  
  inline bool IsSmaller(double a, double b)
  {
      return (a <= (b - epsilon));
  }
  
  This change fixes the problem for the build-in symbol-evaluator.
  DLL- and Perl-programmers have to take care about that rounding-problem themselves. [THF]
- handresetmethod did confuse binary and hexadecimal constants. Thanks to epo for reporting it. [THF]


v2.0.0 2009-05-22
=================
BUG FIXES:
- Applied fix from maintenance branch that addresses did* symbols not being reset between rounds. [OpenHoldem]
- Applied fix from maintenance branch that addresses out of range hash points in a .tm file can cause a crash.  
  Bounds checking added to prevent this occurrence. [OpenHoldem]
- Table map region rectangles are now properly drawn and utilized.  Previously, the right and bottom edges of the
  rectangle were ignored, both when being drawn in OpenScrape, and when being used in transforms in OpenHoldem.  The
  implications of this is that v1 regions require updating, and will be handled automatically in OpenScrape. 
  The file version for .tm's will be updated to ".osdb2" when saved with version 2.0.0+ of OpenScrape.  Opening 
  of older .tm file versions in either OpenHoldem or OpenScrape will result in a warning message with similar 
  information to the above being displayed. [OpenHoldem]
- Hand numbers are now displayed in center info box correctly, if they are integers [OpenHoldem]
- ICMCalculator: for icm_* symbols stacks are now initialized with balances instead of stack_at_hand_start - currentbet. 
  stack_at_hand_start is now only use for icm symbol ("my equity at the start of this hand") [spud]
- Perl preferences didn't load the default formulas name from registry. Thanks to Skyzzo for finding it. [TheHighFish]
- Corrected protection against dangerously low f$willplay/f$wontplay values [Matrix]
- Correct chip scrape routine to stop horizontal scanning on a non-match on the first vertical chip.  Thanks Ares. [OpenHoldem]
- Stopped poker tracker code from skipping name check when it thinks it already found a match.  This will allow the
  code to recover quickly if it happens to mis-scrape a name when originally connecting to a table.  Thanks to Booster
  for the patch.  [OpenHoldem]
- Applied fix from maintenance branch that addresses run$prnuts and run$prnuts always reporting zero.  Thanks, flounderhead, 
  for the find AND the fix! [OpenHoldem]
- Applied fix from maintenance branch that addresses a problem with the chip scraping routine when multiple chip landing spots 
  are specified (i.e. more than just 00/01/10).  Thanks to papa05 for finding the problem.  [OpenHoldem]
- Replay frames are now created with image that is present just prior to the autoplayer acting, unless one of the 'record on
  every change' options is selected, in which case, those frames will be created in the same way as before.  Thanks to
  Nick Coldhand for identifying the issue.  [OpenHoldem]
- Fixed Formula Editor listing of vs$* symbols (listed as v_s$), and added pt_* symbols to be recognized in the Formula editor [Spew]
- Fix for calculation of ncardsbetter on the river.  Thanks Maverick, for the fix.  [OpenHoldem]
- Fix in CTransform for fuzzy font matching when exact match occurs with small number of pixels (like a 'period').  Thanks for
  flounderhead/Bender for the find/fix.  [OpenHoldem]
- Applied fix from maintenance branch that allows for the following symbols to have better detection when players rapidly fold their 
  cards, before OH can get a good scrape.  A non-zero bet will now trigger detection of a player/opponent as well as card faces or 
  card backs. Thanks to Pete for the find and the fix. [OpenHoldem]
  playersplayingbits, playersdealtbits, opponentsplayingbits, opponentsdealtbits, friendsplayingbits, friendsfriendsplayingbitsbits
  and their associated count symbols, nplayersplaying, nplayersdealt, etc.
- versus_path was undifined. We now take the OpenHoldem-installation-directory to search for versus.bin. [TheHighFish]
- Surround database name in single quotes when testing PokerTracker connection
- pcbits returned incorrect values (0x1F) for X2s. Thanks to Want2Learn for reporting it. [TheHighFish]
- slider was not being found and jammed if it was not in the left-most position.  Thanks to the poster of issue 19 for the find and fix [OpenHoldem]
- Added missing symbols to the formula-editors symbol list. Thanks to pokerweeny and gman for reporting. [TheHighFish]
- Fixed memory leak in CTablemap.cpp. Thanks to Oskar for reporting the bug. [TheHighFish]
  
MAINTENANCE:
- Optimized symbol-lookup. [TheHighFish]
- Removed last SEH-code (__SEH_SET_EXCEPTION_HANDLER), which is no longer neccessary. [TheHighFish]
- The Autoplayer will not act on a frame which is not processed by the game state processor [ZooBoy]
- Migration of table map z, s, r, t, p, h and i record handling from CArray's with manual indices to std::map structures. [OpenHoldem]
- Changed the initial value of the following symbols from -1 to 0: 
allidelay, floppct, turnpct, riverpct, avgbetspf, tablepfr. [TheHighFish]
- Removed the "risk-of-ruin"-symbols from the code-base due to lack of documentation and practical relevance. [TheHighFish]
- Updated blinds "reasonableness" check in CSymbols::CalcStakes, per suggestion by Sharky.  [OpenHoldem]
- Pokertracker logging information is now directed to "oh_pt_X.log" where X is the OH instance number.  [OpenHoldem]
- Continuing improvement in cross-thread resource contention protection (CMemory, CScraper, CSymbols) [OpenHoldem]
- Removed final references to 'whuser' and 'gws' throughout, where possible. [OpenHoldem]
- OH would use the uXbalance and uXname regions to obtain the balance and name for ONLY the user, I changed it so that it can be used for all players (Spew)
- Removal of identifying information from Properties/Version display in Windows Explorer. [OpenHoldem]

NEW STUFF:
- A new option to prevent the calculation of the primary functions (f$swag, f$rais etc) when it is not the players turn.  It will also prevent the calculation of most of the expensive symbols including the pr* however the handrank symbols will be calculated as these are commonly used in the f$prefold calculations.  f$prefold and f$play are still evaluated regardless if it is your turn or not.  The preference can be found in the Autoplayer page of the Edit->Preferences (Spew)
- The function f$autotrace will now be called once per action but its value will be ignored.  This is added in order to capture symbols using the AutoPlayer Trace (requested by USBFreak) (spew)
- Added option to save all replay frames whenever something changes when you are in the hand (Thanks, markedagain for the patch) [OpenHoldem]
- Added support for PokerTracker v3 (Thanks, fn101 for the query translation) [OpenHoldem]
- Added option to disable runtime message boxes [OpenHoldem]
- Added runtime-check for recursive formulas. [TheHighFish]
- Added OH-Validator to verify the gamestate at the symbol level. 
  Documentation: http://www.maxinmontreal.com/wiki/index.php5?title=OpenHoldem:EndUserDocumentation:Validator
  Thanks to all the people who help developing and testing: USBFreak, Xtions, Tinkerer, Maverick, Bender and Want2Learn.
  [TheHighFish]
- "swagselectionmethod", "swagdeletionmethod", "swagconfirmationmethod" and "buttonclickmethod" are now settings that are drawn from
  the table map file. The settings that might be saved in the registry from previous OpenHoldem versions are deprecated and are now 
  ignored for these methods.  SWAG timings are still set in OpenHoldem preferences, as usual. Opening a version 1 .tm file with version
  2.0.0+ of OpenScrape or OpenHoldem will result in a reminder message to check these fields. If these methods are not specified in 
  the .tm file, then the default actions are:
  swagselectionmethod = Dbl Click  (valid values are "Sgl Click", "Dbl Click", "Click Drag" or "Nothing")
  swagdeletionmethod = Delete  (valid values are "Delete", "Backspace" or "Nothing")
  swagconfirmationmethod = Enter  (valid values are "Enter", "Click Bet" or "Nothing")
  buttonclickmethod = Double  (valid values are "Single" or "Double")
  [OpenHoldem]
- Added new Table Map "swagselectionmethod" option: Single Click  [OpenHoldem]
- If a user DLL sends the request "cmd$recalc", then the versus tables are recomputed and the iterator thread is restarted.
  [ZooBoy]
- Added handling of "handresetmethod" as specified in the table map file to identify which scrape changes should be used 
  as a trigger to identify a "hand reset" event. This is a bitmapped integer; only one of the selected scrape changes needs 
  to occur in order for the scrape to be considered a "hand reset".  The values below are in hexadecimal format, but the 
  value assigned to the "handresetmethod" symbol must be specified in decimal (base-10) format.  As an example, if you
  want to instruct OpenHoldem to treat a change in dealer button OR a change in player cards as a "hand reset", then 
  "handresetmethod" should be set to 5.  If you want to instruct OpenHoldem to treat only a change in dealer button as a 
  "hand reset", then "handresetmethod" should be set to 1.
  - 0x00000001 = dealer button
  - 0x00000010 = handnumber
  - 0x00000100 = player cards (not triggered by change to "no cards" or to "card backs")
  [OpenHoldem]
- Added handling of new uXdealer and uXbet regions.  These new regions correlate to the pXdealer and pXbet regions in much the
  same way as uXname/pXname and uXbalance/pXbalance. If, for example, pXdealer does not match, then the scraper engine will
  check uXdealer for a match.  [OpenHoldem]
- Symbol myturnbits does now support the check-button (bit 4; value 16) [TheHighFish]
- Added: Menu item to force crash for testing purposes, including a confirmation-dialog [TheHighFish]
- New option in Autoplayer preferences to use a comma instead of a 'dot' for separation of the whole number from the
  fractional number when swagging.  Thanks to ZeuZDK for the patch.  [OpenHoldem]
- New option on PokerPro dialog to create hand history files in a FullTilt format to allow importing into PokerTracker.
  HH files are created in the PPro\FTHH subdirectory of the OH installation, in a subdirectory named for the PPro login.
  Thanks, Sinbad_the_Sailor, for the patch.  [OpenHoldem]
- Added 10 additional flag buttons (numbers 11-20) [ZooBoy]
- New stealth preferences to  1) specify what class name OpenHoldem will use 2) specify the name of the anti-collision mutex, and
  3) specify to use simple window title [spew]
- Options to load preferences from ini file based on a command line option, examples: 
  /ini => openholdem.ini
  /ini:[filepath] => uses the file path provided, must be a full path
  /ini:~\[filename] => uses [filename] ini file in OpenHoldem's working directory
   [spew]
- A connect message to instruct OH to connect to a poker table specifying a HWND [spew]
- OH's mouse and keyboard interactions are now handled by external mouse.dll and keyboard.dll files.  Reference implementations
  of these files are provided in the source code and with the binary distribution.  Anyone can now modify these DLLs to add extra
  functionality (queueing of requests?) or stealth, for example. Included in these implementations is Arkayn's suggestion to use
  the windows API function "AttachThreadInput" to ensure the correct target window receives the input. [OpenHoldem]
- New option added to .tm files to allow the loading of an external scraper override DLL.  This external DLL can be used to
  override the results of the internal scraper engine.  This DLL is called immediately after the internal scraper engine
  finishes its pass every heartbeat, and the current state of the internal scraper is passed to the DLL for inspection and
  modification.  A reference scraper DLL is provided in the source code as a starting point.  An obvious use of this would
  be to hook or inject the target casino client to retrieve better state information than that which could be collected using
  the built-in pixel scraper.  The DLL to load is specified by the 'scraperdll' symbol in the .tm file.  [OpenHoldem]
- Added handling of "balancenumbersonly" as specified in the table map file which allows for specifying that all characters besides 
  numbers (0-9 and dot/decimal separator) are stripped from the text transform result for balance regions.  This is useful for those
  casinos that include spurious/changing alphanumeric information in their balance boxes.  Setting this string to "True" or
  "Yes" will enable balance cleansing, any other value or the absence of this string will result in no balance cleansing.
  Thanks to Nick Coldhand for the patch.  [OpenHoldem]
- File/Disconnect menu option added.  [OpenHoldem]
- Detailed level-3 logging is now available for critical parts of OpenHoldem, including the heartbeat thread, the scraper engine, and
  and the autoplayer engine.  More can be added as it becomes clear that it is needed.  [OpenHoldem]
- Added support for 5th prize in ICM calculator.  [OpenHoldem]
- Added handling of "chipscrapemethod" as specified in the table map file which allows for specifying that the scraper engine
  should check either all 200 possible chip locations (10 stacks of 20 chips) ("All") or certain grid of chip locations ("XxY")
  everytime a chip scrape region is required.  The default behavior is to stop checking a given stack when there is no match, 
  and to stop checking all stacks when the base chip for that stack does not match. This is only valid when a region specifies 
  the 00, 01, and 10 locations only.  For regions that specify other chip landing spots, those chips/stacks will be checked as 
  per original behavior. [OpenHoldem]
- Added "Edit/Force User Chair" menu item.  This will bypass OH's automatic detection of the user's chair, and set it to whatever
  you specify.  This is really useful for debugging/manual mode, but can be used to specify the user's chair at a live table
  prior to OH auto-detecting it, if you so choose. [OpenHoldem]


v1.9.4 2008-10-21
=================
BUG FIXES:
- Validation of card information passed in from PokerPro server to avoid crashes when/if bad information
  is passed in. (OpenHoldem)
- f$srai would show up as [Cached] in the Autoplayer Trace.  This function will now be traced if f$swag is set to be traced. (Spew)
- Corrected error in ICM::GetChairFromDealPos method introduced in 1.9.3a and identified by SNG.Champ (OpenHoldem)
- Eliminated artificial limitations on the number of font or hash records that can be present in any given tablemap (.tm) file.
  Previously this was set to 512 for each.  Thank you to Nick Coldhand & Folder for busting the limit.  (OpenHoldem)
- Fix for non-released crit sec in CDlgScraperOutput::do_update_display. Identification by ZooBoy, patch by Elvis.
- log$ functions were not displayed properly on the main OH display (Spew)
- The formula editor would allow the creation of duplicate lists and udfs.  The rename and new operations did not check for uniqueness (Spew)
- Added range check in CTransform::DoPlainFontScan to correct out-of-range error with large fields (more than 169 pixels wide).
  This bounds violation can and will cause sporadic access violation crashes. Thanks to Nick for finding the problem and providing 
  the .tm/frame to diagnose the issue.
- Corrected OH to properly recognize "Network" setting on ManualMode, to report "network$" symbol correctly, and to correctly
  retrieve PokerTracker symbols when connected to a ManualMode table.
- Full house hand strength was not working correctly with trips on board.  Identification of problem and submission of patch by elvis.
- CSymbols.cpp mofified to give correct pcbits/npcbits value when a straight or straight flush contains an Ace(noted by fn101). (Matrix)
- Fixed problem of seeding of RNG.  Spawned threads were not seeding the RNG pseudo-randomly.  (Thanks, Matrix, for the fix)


MAINTENANCE:
- Removal of fatal_error.log creation on crash.  This has been replaced by minidumps.
- Further stabilization of code tree, especially regarding class encapsulation and thread critical section handling.
- The Optimizer in the compiler has now been enabled by default for Release builds.


v1.9.3 2008-08-22
=================
NEW STUFF:
- NONE PLANNED

BUG FIXES:
- Problem with session_ID causing multiple instances of OH to write into 
  the same log-file. (Thanks, USBFreak). Unique session IDs are in the range
  0..N, as small as possible. (TheHighFish)
- Some preferences setting got not saved correctly. (TheHighFish) 
- i3slider jamming fix http://www.maxinmontreal.com/forums/viewtopic.php?f=111&t=5263 (Spew)
- Cancel on apply confirmation dialog in Formula Editor would not cancel the close operation (Spew)
http://www.maxinmontreal.com/forums/viewtopic.php?f=111&t=5189
- Use of re_st_ and re_re_ symbol would always make the Autoplayer Trace output the results of the function being called (Spew)
- Further "crash" bug fixes - removal of superflous code in heartbeat_thread. (OpenHoldem/Spew)
- Error in PokerAction::pf_bets function corrected.
- CScraper::ScrapeName, CScraper::ScrapeBalance, correted code to check seated status with "IsStringSeated" function.

MAINTENANCE:
- Complete reworking of thread model to make use of critical sections more intuitive, and to improve
  reliability of code.  Current thinking is that thread concurrency issues are a source of the
  current spate of crashes, this reworking addresses those concurrency issues.
  Specifically, the following classes are now fully encapsulated with access to member variables
  being provided via accessor and mutator functions.  Access to class members is strictly limited
  to the published interface, and is enforced at compile time via private class sections and
  const-ness checks.  Critical section handling is also now within the class and is used to
  serve the relevant mutator functions.  Classes that are not included in the list below will be fully
  encapsulated at a later date.
  - CScraper
  - CSymbols
  - CIteratorThread
  - CAutoplayer
  - CHeartbeatThread
  - CPokerTrackerThread
  - CGlobal (partial)
              
- Consistency of variable/function naming has been applied for the CScraper and CSymbols classes.
- Minidumps are now generated automatically upon a crash - dumps can be found in your OpenHoldem
  startup directory.   This feature requires dbghelp.dll to be distributed with OpenHoldem.  This file
  should be placed in the same directory where OpenHoldem.exe lives.
- Primary formulas (f$alli, f$swag, f$rais, f$call, f$play, f$prefold, f$delay, f$chat) are now only 
  calculated once per heartbeat and reused.  Update of main window (best action, especially) is much more timely.
- System-wide mutex is now created once, upon instantiation of the CAutoplayer class.  Locks and unlocks all now
  use this single mutex instance.  All early, exception-case exits that *may* have resulted in an unintentionally
  long-locked mutex have had Unlocks added.
  
v1.9.2 2008-07-25
=================
NEW STUFF:
- Perl supports now player names and table name; gwp and gwt function (by elvis) (TheHighFish)
- Added to the Hand List Dialog a display of what percentage of hand the current hand list represents (Spew)

BUG FIXES:
- corrected pcbits / npcbits for straight and straight flush cases. (Thanks, pokerbandit) (Matrix)
- Don't clobber the hand number for the first frame of a new hand
- Make the i86 button work.
- Corrected typo in prw1326 vanilla chair init. (Thanks Eesahe) (Matrix)
- Corrected opening of formula to not require exclusive file access (Thanks Spud) (OpenHoldem)
- Associated the OpenHoldemDoc class with both ohf and whf file types. (TheHighFish)
- Perl: Loading interpreter now without restart, when enabled in the preferences dialog. (TheHighFish)
- The infamous "random crash bug" fixed.  Occurred during parse, manifested during a dll gws call in 
  the destructor of skip_grammar http://www.maxinmontreal.com/forums/viewtopic.php?f=156&t=5170 (Spew)
- Fix for this bug fix in 1.9.1: 'Changed button states to not require a perfect match on returned values, but
  rather a substring match.  Thus a button state returning "true1", "true2", etc will work properly now'
  This change negatively impacted the behavior of the sitin/sitout recognition, and the poker tracker
  query symbols, at a minimum.  This is due to the fix being based on a substring search of the state,
  rather than on the first X characters.  Thank you to many people for identifying the effects of this
  bug, and to quiqsilver for identifying the root cause (OpenHoldem)
  
  
v1.9.1 2008-06-27
=================
NEW STUFF:
- Added semantic action to grammar to allow for validation of symbols upon parsing of
  formula code.  Symbols that are not valid, but syntactically correct, will now be flagged
  appropriately.  See here for more information on sematic actions in the spirit
  library: http://spirit.sourceforge.net/distrib/spirit_1_8_5/libs/spirit/doc/semantic_actions.html
  (OpenHoldem)
  
- Added additional validation of numeric fields.  To be considered numeric, a scraped region must not
  only contain only these characters "$0123456789,.ckm", but must 1. have 0 or 1 decimal points, and 
  2. If a decimal point is present, then there must be exactly 2 numbers following it. (OpenHoldem)

- User defined functions are now recognized by the Formula Dialog so that they are now colored (Spew)

- islistXXX and vs$XX$pr* symbols are color-coded only if the equivalent hand list is defined (Spew)

- Added f$prefold to the Autoplayer Trace (Spew)


BUG FIXES:
- Only locate/open the versus.bin file during OH initialization to avoid
  problems with the current directory changing. (ZooBoy)

- Fix icm_allilose once we're in the money.  Avoid potential out-of-bounds
  accesses to prizes[]. (ZooBoy)

- Fix assertion failures in ICMCalculator.cpp when reconnecting to a table
  without changing the hand in play. (ZooBoy)
  
- Added recalc of symbols upon press of a flag button (OpenHoldem)

- Changed button states to not require a perfect match on returned values, but
  rather a substring match.  Thus a button state returning "true1", "true2", etc
  will work properly now (OpenHoldem)

- Checking headers of OH formulas for missing trailing string "##",
  which caused incorrect array indices and crashes. 
  Trying to continue gracefully. (TheHighFish)	
  
- Possible buffer overflow with reading of window title text has been corrected in
  scraper.h and scraper.cpp (OpenHoldem)
  
- Poker Tracker symbols no longer permanently fail (always return 0) after red button/
  sitting out. (Thanks, Winngy) (quiqsilver)
  
- Erratic problems with attempting to retrieve Poker Tracker data when using Manual Mode
  are now fixed. (Thanks, eesahe) (quiqsilver)

- Correcting possible issue that can cause a crash. Worker threads should not be playing with windows (SetWindowText) - Spew

- The third form of the hand multiplexor (f$$XXx) was not differentiating between suited 
  and non-suited hole cards correctly.  (eesahe/OpenHoldem)
  
- Corrected prw1326 .weight limit glitch. (Thanks, eesahe) (Matrix)

- Fixed problem where "$$" was passing parse checks.  "IsHand" function has been augmented to detect and
  report malformed requests.  (OpenHoldem)
  
- Fixed problem where certain malformed symbol combinations would pass parse validation, such as 
  "$T7s $89s". (OpenHoldem)
  

MAINTENANCE: 
- A single OpenHoldem Formula file (*.ohf) instead of *.whf and *.whx.
  The WinHoldem format is still recognized, but gets converted automatically 
  when saved. (TheHighFish)

- Treating f$evrais and f$evcall now as user defined functions,
  as they are not necessary for the majority of poker bots 
  (only for the default one).
  f$delay and f$chat became standard functions, as they could have 
  a greater impact on the behaviour of bots. 
  Slightly modified default bot to reflect this change. (TheHighFish) 
  
- Added parameter validity checking on all functions in scraper.cpp.
  (OpenHoldem)
  
- Random button clicking logic changed to further improve distribution of
  click points in Autoplayer::get_click_point.  (Indiana/OpenHoldem)
  


v1.9.0 2008-05-16
=================
NEW STUFF:
- Autoplayer Tracing - In Edit->Preferences,Logging you can now enable tracing of specific
  functions used by the Autoplayer.  When enabled you will see the results of all functions
  and all the symbols (and their values) that were accessed by those functions in oh?.log. (Spew)
  
- Group UDFs - The formula dialog will now place functions whose name match up to the 
  first "_" together in the left tree. 
  For example, f$river_raise, f$river_call will be grouped under the group named "river".  
  This is optional and can be turned on under View->Group UDFs menu (Spew)

- Display Log symbol on OH screen.  If log symbol are enabled in OH preferences, 
  the information box will be enlarge to allow for 4 log symbols to be displayed while OH is running (Spew)

- Added image transform capability with perceptual difference algorithm (OpenHoldem)

- Added support for jamming the slider handle, but only when both an i3handle and an i3slider 
  are defined in the TM. Also required; f$alli must be true, ismyturn must be true, and scraper 
  must have found i3handle on the i3slider path. The handle will be grabbed and pulled to the 
  extent of slider, and i3button or whatever is defined as alli_but will be depressed.

- Check for enough disk space, when shooting replay frames (min. 10 MB). (TheHighFish)

- prw1326, Facility for a dll to activate and control individual chair handlists which are then
  used in the OH prwin calculation. Unless explicitly activated from the dll normal prwin logic 
  is applied. (Matrix)

  
BUG FIXES:
- Perl menu: "Reload" command was active, even when no formula was loaded (Thank you, JumpingFences).
  Same for "Edit" and "Check syntax". Fixed in rev. 283 (TheHighFish)	

- Added an "OnBnClickedOk();" accidentally deleted in rev. 278. (TheHighFish)	

- Formula gets saved under wrong file name (jumpingfences) 	

- OH opens not on top and not in focus (jumpingfences)

- uXactive fix in 1.8.2 is now compatible with activemethod.  (quiqsilver)

- Closed DC/GDI leakages as identified by ZooBoy here: http://www.maxinmontreal.com/forums/viewtopic.php?f=111&t=4398
  (OpenHoldem)

- Version 1.8.2 added this feature: "Added sanity checks around the SWAG action stream - if focus is 
  stolen from the target window during the four SWAG steps, then the final step (confirmation) will 
  not be executed."  This has been added as a setting in this version.  The setting defaults to "Off"
  initially (but will be saved if set), so make sure and select it if you need it 
  (Edit/Preferences/Autoplayer).  (OpenHoldem)
  
- New variable originaldealposition added which remembers dealposition even when the user has folded
  a hand. (Matrix)

- Fix in Autoplayer::check_bring_keyboard to correctly enumerate bring system menu items (Thanks,
  AndreL for the fix) (OpenHoldem)
  
- Fix to count_same_scrapes() location in Autoplayer::do_autoplayer, so that it is updated for every 
  frame and not only for the ones where 2 buttons are visible.  (Thanks Spud) (OpenHoldem)
  
- Unload message sent to dll on OH closedown (Spud's fix - Matrix)

- List handling now recognises the current 1000 lists (Matrix)

- Change in CSymbols::calc_stakes to ensure that ante is reset properly each scrape.  (Thanks ZooBoy)
  (OpenHoldem)
  
- A simplification to the pseudo-RNG was made several releases ago, which consolidated the seeding of the
  RNG into the COpenHoldemApp class.  This has not had the desired effect, and in fact, the pRNG was not
  being seeded for things such as random button clicking location, and prwin shuffling.  The original
  approach has been restored and seeding of the pRNG has been added to the constructors of the CSymbols
  and Autoplayer classes, and has been added to the start of the prwin_thread thread.  (OpenHoldem)

- Versus code modified to handle >100 handlists - Matrix
  
  
MAINTENANCE:
- Active and seated scraping now evaluates p first for efficiency.  (quiqsilver)

- As part of the pdiff implementation and tuning, I got tired of updating the table map load/save
  code in two places, and have moved this code to the CTransform class where it belongs.  A great
  deal of code was touched (more than I anticipated), so please test carefully.  (OpenHoldem)

- When pressing the green button, a 15 file limit in the scraper directory existed (OH would only search
  the first 15 table maps).  This limitation has been removed. (OpenHoldem)
  
  
v1.8.2 2008-04-25
NEW STUFF:
- Make CFileDialog open in the most recently accessed directory in the context of 
  file type (.whf, .tm, .dll, .pl) (jumpingfences)
  
- New type of symbols available for logging: log$YourTextGoesHere
  These symbols should make debugging formulas drastically easier.
  
  When executed, they add your specified text to the log.
  
  For example if you have:
  [ br == 2 && (nsuited == 3 || nstraight == 3) && log$ItLives ]
  in your f$rais formula and you flop a backdoor flush draw,
  then OpenHoldem will raise and also add the text "ItLives" to the log file,
  just before the RAIS line. Everytime a log$ symbol is accessed it will be flagged for logging.
  You can use this to track which part of your formula is to blame for the action taken by OH.

  Note: You want to use the log$ symbol at the end of a logic block,
  to make sure it only gets flagged when all the previous statements are true. (Strom)

- versus.bin path registry entry (jumpingfences)

BUG FIXES:
- Fixed the uXseated and uXactive regions being ignored. (Strom)

- Fixed a freezing bug that was caused by common card animations and/or occlusion. (Strom)

- Removed "scrapes to name change" and "scrapes to zero balance" from scraper preferences.  For names,
  if a good name is scraped, the name is set.  For balances, if a good number is scraped, the balance
  is set, or if "allin" or its variants are scraped, balance is set to zero.  (OpenHoldem)
  
- Userchair identification now requires 2 action buttons to be present (previously, only one needed to
  be present).  (OpenHoldem)

- Added sanity checks around the SWAG action stream - if focus is stolen from the target window during 
  the four SWAG steps, then the final step (confirmation) will not be executed.  (Thanks, AndreL)  
  (OpenHoldem)

MAINTENANCE:
- Removed code-clones in registry.cpp. Replaced by functions. (TheHighFish)
- Replaced exception handling code clones by macros. (TheHighFish)
- Used a code indenter to beautify the *.cpp files. Atm *.h files still to do. 
  Looking for an easier solution. (TheHighFish)
  
  
  
v1.8.1 2008-04-11
NEW STUFF:
- Show wait cursor when parsing f$debug (jumpingfences)

- New symbol s$activemethod is now available.  This is used to determine how OH treats
  information from the pXactive and uXactive regions.
  - 1: (default, legacy) Inactive unless pXactive/uXactive returns true/active
  - 2: (new) Active unless pXactive/uXactive returns false/inactive/out/away  (Thanks,
    Nick Coldhand)  (quiqsilver)

- When using ManualMode, the new "Network" option now available in the ManualMode interface
  is now used as the network for Poker Tracker data.  This means s$sitename and s$network in
  the ManualMode table map are no longer used for Poker Tracker.  (Thanks, Winngy)
  (quiqsilver)
  
- New dll message phl1k introduced to pass address of OH handlists (Matrix)  

- Added memory symbols from SM's DLL (OpenHoldem)
	Memory symbols
	---------
	me_st_abc_123_45 - 'me_st_' stores a value "123.45" in variable "abc" 
	   (use "_" for the decimal in values)
	   (a function name can also be passed in, instead of a number, for example:
		'me_st_def_f$myfunc' would store the results of function f$myfunc in variable def)
	me_re_abc - 'me_re_' retrieves the value from variable "abc"
	
	Note to testers:  In order to make this work, I had to slightly alter the grammar definition,
	   Specifically, the definition of a SYMBOL was changed from:
	     SYMBOL			 = leaf_node_d[ lexeme_d[ ((alpha_p | '_' | '$') >> *(alnum_p | '_' | '$')) ] ];
	   to:
		 SYMBOL			 = leaf_node_d[ lexeme_d[ ((alpha_p | '_' | '$') >> *(alnum_p | '_' | '$' | '.')) ] ];

- Two visible buttons are now required to be seen by the scraper before the autoplayer will act.
  There is no valid Texas Holdem game state where only one button is visible. (OpenHoldem)
  
- For scraper preferences, the number of "Scrapes to change name" and the number of "Scrapes to zero balance"
  defaults to "1", if not already stored in the registry.  (Thanks, Nick Coldhand) (OpenHoldem)
  

BUG FIXES:
- Incorrect initialization of new hand and new betting round (jumpingfences)

- The correct blind size will now be inferred in a heads up situation.  (Thanks, PhunkNugget)
  (quiqsilver)
  
- ntraightfill family calculation corrected to give correct result when straight present (Matrix)

- Formula Editor dialog changed to prevent higher than list999 being referenced (Matrix)

- Autoplayer will not act if user not playing (no cards in hand) (Matrix)  

- Fixed inconsistent Window Title after disconnecting from table (Spew)

- All "MessageBox(NULL, ..." calls have had  "| MB_TOPMOST" added to ensure that these popup warnings
  are visible and not hiding below other windows.  (OpenHoldem)
  
- All _beginthread calls have been replaced with AfxCreateThread for better alignment with MFC
  standard practice (OpenHoldem)
  
- Fixed bug in logical OR and logical AND expression evaluation.  Was casting resultant component 
  expressions to an unsigned long prior to doing logical evaluation.  Now comparing resultant component 
  expressions to zero prior to doing logical evaluation.  (Thanks, CyberCriminal)  (OpenHoldem)
  
- Betround is now identified based on the highest card seen on the board
    if card 5 is seen, then br=4 
    if card 4 is seen, then br=3
    if cards 1, 2 or 3 are seen, then br=2
    else br=1
  (Thanks, Strom)  (OpenHoldem)
  
- CRunRon::get_counts has been reworked to count common cards that are visible, rather than
  expecting them to be there based on the betting round (Thanks, Strom)  (OpenHoldem)
  

v1.8.0 2008-03-29
NEW STUFF:
- New symbol s$potmethod is now available.  This is used to determine the appropriate
  site interpretation for the contents of c0pot0.  s$potmethod can be set to these values:
  - 1: (default, legacy) Common pot
  - 2: (new) Total pot, including current bets and side bets  (Thanks, Nick Coldhand)
  (quiqsilver)
  
- Hand multiplexor symbol capability added.   The three valid hand multiplexor symbols are 
  "f$$X", "f$$XX", and "f$$XXx".  Note that the X's and x's are not case sensitive.
  The purpose of the hand multiplexor is to transfer control to a specific named formula 
  based on your actual 2 card hand.
  
  The X's in the three symbols will be substituted with your actual hand values at time
  of evaluation.  The first "X" will contain the the rank of your highest hole card, the 
  second "X" will contain the rank of your lowest hole card, and the third "x" will contain
  either a "s" or "o" depending if your hole cards have the same suit or not.  The $$ will
  be replaced with a single dollar sign.
  
  For example, if my hole cards are AhKh, then "f$$X" will result in "f$A" upon evaluation
  Similarly, "f$$XX" would result in "f$AK" and "f$$XXx" would result in "f$AKs".
  
  OpenHoldem will then evaluate the corresponding user defined function and return that value
  for the hand multiplexor symbol.  If there is not a corresponding UDF defined for a given 
  set of hole cards, then the return result is zero, not an error.

  The values returned by the hand specific UDFs are entirely defined by you; one simple 
  suggestion is to have them return 1 for call and 2 for raise; if you do this then your 
  raise formula can do this: 
  "|| [ f$$XXx >= 2 ] //hand specific formula calc"  
  
- Additional symbols from SingleMalt's DLL:
	Action symbols
	---------
	ac_aggressor - which chair was aggressor (might be from previous round)
	ac_agchair_after - does the aggressor chair act after me?
	ac_preflop_pos - preflop position of the userchair (SB=1 BB=2 Early=3 Middle=4 Late=5 Dealer=6)
	ac_prefloprais_pos - preflop position of the raiser (SB=1 BB=2 Early=3 Middle=4 Late=5 Dealer=6)
	ac_postflop_pos - postflop position of the userchair (first=1 early=2 middle=3 late=4 last=5)
	ac_pf_bets - returns 1 for no callers or blinds only
						 2 for Called Pot - 1 bet to call
						 3 for Raised Back - 1 more bet to call because someone behind you raised after you've already bet/called/raised
						 4 for Raised Pot - 2 bets to call
						 5 for Reraised Pot - 3+ bets to call
						  NOTE: Only valid when br==1
	ac_first_into_pot - returns true if you are first to act
	ac_betposx (x=0-9) - returns bet position of specified chair
	ac_dealposx (x=0-9) - returns deal position of specified chair

	MyHand symbols
	---------
	mh_3straightxy (x=1 for wheel, 0 not, y=1 for broadway, 0 not) - returns true if the board 
		has a wheel straight draw or broadway straight draw, given the wheel/broadway parameters 
		00 - true if the board has neither a wheel straight draw nor a broadway straight draw
		10 - true if the board has a wheel straight draw
		01 - true if the board has a broadway straight draw
		11 - true if the board has either a wheel straight draw or a broadway straight draw
	mh_bottomsd - returns true if I have a bottom straight draw
	mh_nsuitedbetter - returns the number of missing suited cards that are higher than my best suited card 
	mh_kickerbetter - Number of cards that can beat your kicker
	mh_kickerrank - The rank of your kicker (returns 0 if kicker is shared [board] and thus useless)
	mh_nouts - returns number of outs (HTC's formula)  
	mh_str_strflush - returns a value from 0-5 (5 best) of the relative strength of your straight flush
	mh_str_quads - returns a value from 0-5 (5 best) of the relative strength of your four of a kind
	mh_str_fullhouse - returns a value from 0-5 (5 best) of the relative strength of your full house
	mh_str_flush - returns a value from 0-5 (5 best) of the relative strength of your flush
	mh_str_straight - returns a value from 0-5 (5 best) of the relative strength of your straight
	mh_str_trips - returns a value from 0-5 (5 best) of the relative strength of your three of a kind
	mh_str_twopair - returns a value from 0-5 (5 best) of the relative strength of your two pair
	mh_str_onepair - returns a value from 0-5 (5 best) of the relative strength of your one pair
	
- Formula Editor: Symbol Tree 
      - Added a sorted list of all symbols which is in addition to the existing list of symbols grouped by category
      - Delayed the insertion of the symbols until the user clicks on the 'Symbol' tab to avoid any performance issues
      - Added context menu on Symbols to allow Copy-ing to the clipboard

- Reload Perl Formula (menu) to avoid unload + load. (TheHighFish).

- Perl syntax check. (TheHighFish). 

- Added some hotkeys:
    * F12 Shoot replay frame
    * F4/F5 Load (specific) DLL
    * F7..F11 Perl menu
    (TheHighFish)

	
BUG FIXES:
- OH will no longer force blinds to bblind==2*sblind, when bblind!=2*sblind.  For example,
  sblind=$0.10 and bblind=$0.25 are acceptable.  (OpenHoldem, thanks to Spud for fix).
  
- Typo in CScraper::DoScrape corrected.  "if (!seated[i] & !active[i])" fixed to
  "if (!is_string_seated(seated[i]) && !is_string_active(active[i]))" (OpenHoldem)

- File selection dialog for Perl fixed. The filter shows now correctly 
  Perl scripts and modules. (TheHighFish)

- Passing pointer to the callback function now everytime to Perl, 
  when a new file gets loaded, instead of only once when the
  interface is initilaized. (TheHighFish)
  
- Assertion failure in CFontDialog (jumpingfences)

- Autopost will now work if the autopost button is not present while sitting out. (quiqsilver)

- m_name_known, m_balance_known will be properly set when connected to PPro (spew)

- logging (oh1.log) was not used when connected to PPro (spew)
  
- Default formula no longer sets modified flag, so you are not prompted to save it when loading
  some other formula, or on exit. (OpenHoldem)
  
- Fixed code that ensures OH window is brought to top on start.  It now waits for any formula
  loading and parsing to complete before doing so, which was the behavior prior to the 1.7.0 release.
  (OpenHoldem)
  
- Hand resets are now triggered not only by a change in dealer button, but by a change in handnumber
  or by a change in the userchair's cards from the previous hand.  (OpenHoldem)

- (TheHighFish) Fixed bug with floating point division introduced by this change in 1.7.0:
  "Detection of divide-by-zero expressions has been corrected/enhanced for situations that include 
  invalid symbols (OpenHoldem)"
  In grammar.cpp, changed:
	unsigned long div = eval_expression(f, i->children.begin()+1, e);
  To:
	double div = eval_expression(f, i->children.begin()+1, e);
	
  
v1.7.0 2008-03-15
NEW STUFF:
- All Poker Tracker-compatible sites are now supported by OH for pulling Poker Tracker data.
  The table map must have s$network or s$sitename set to a supported name (see s$network below
  for a complete list). (quiqsilver)

- New symbol s$network is now available.  This is used to determine the appropriate
  network to pull Poker Tracker data for when s$sitename is not a PT supported site.  OH will
  first check s$sitename for a supported network name, then s$network.  These are the supported
  names for both s$sitename and s$network and must be lowercase: stars, party, ultimate, absolute,
  microgaming, ongame, cryptologic, pacific, fulltilt, b2b, tribeca, worldpex, ipoker, tain,
  bodog, everest, boss, and betfair. (quiqsilver)

- OpenHoldem will now use Poker Tracker data when connected to ManualMode if s$network or
  s$sitename in ManualMode's table map is set to a Poker Tracker compatible name. (quiqsilver)
  
- Integration of the ActiveState Perl interpreter. (TheHighFish)

- Automatic poker chat for formula and DLL level. (TheHighFish) 

- Warnings have been added when you click the Connect button for common configuration issues.
  Font Smoothing, 24+ Bit color, and a check for Title size to catch XP Themes and Font Size settings (Spew)

- Added a check for a card string of "10" instead of "T", to be converted to a "T", in both common and
  player card rank fuzzy scrapes (e.g., "if (rankstr=="10") rankstr="T";"). - BillW

BUG FIXES:
- OpenHoldem no longer performs unnecessary Poker Tracker database queries when we are not using
  a compatible site. (quiqsilver)

- ishandup and ishandupcommon now determined using memories of the high bits of pokerval rather than
  the raw return from hand_eval_N (Matrix)
  
- Formula Dialog stays open untill File->New and File->Open completes. Toolbar button 
  sometimes stays pressed after Formula Dialog gets closed. (jumpingfences)
  
- Removed some circular dependences between some non-GUI modules and MainFrm and OpenHoldem 
  by moving sessionnum, g_tlist, startup_path to CGlobal. Uncoupled symbols from PokerPro. (jumpingfences)
  
- Preferences tabs sorted in alphabetical order. (TheHighFish)

- Detection of divide-by-zero expressions has been corrected/enhanced for situations that include invalid
  symbols (OpenHoldem)

- ishiflush and ishistraight now properly represent having the highest possible true hand of the respective
  type.  This does not include hands of a different rank, such as royal flushes and straight flushes.
  (Thanks, PokerBandit1 and Winngy) (quiqsilver)

- Side pots (c0pot1-4) not added to 'pot' and 'potcommon' - fixed (Spew)
  
- Source code:  CTransform class (transform.cpp and transform.h) now live outside of the OpenHoldem and OpenScrape
  directories, so it can be shared without manually needing to copy code from place to place.  (OpenHoldem)
  
- OpenHoldem's main window will now appear on top at launch.  (CMainFrame::OnCreate)  (OpenHoldem)
  

v1.6.0 2008-02-22
NEW STUFF:
- Table maps using fuzzy fonts are now utilized correctly in the scraper engine.

- OpenHoldem and OpenScrape now use an identical CTransform class (this is found in the
  transform.cpp/.h files).
  
- Formula Editor (Thanks Spew for the code)
  - Added help links to Wiki and Forum (Help/Wiki, Help/Forum)
  - Added popup help for symbols.  Look at the formula tree, select the "Symbols" tab,
    and hover your mouse pointer over the symbol that you are looking for help on.

- In a further attempt to reduce mis-swags, an additional mouse click on the edit box
  has been made after the text is deleted, and before the SWAG text is entered.
  (Autoplayer::do_swag)
  
- Added option to double click on action buttons.  This may help in dealing with those
  sites that have buttons that are "hard" to push.  
  Edit/Preferences/Autoplayer/Button Clicking Method (Thanks, Winngy for the idea)
  
- Added option to disable all symbol caching.  (Thanks, Matrix for the idea)
  Edit/Preferences/Symbols/Disable all Symbol Caching.
  

BUG FIXES:  
- Seeding of random number generator moved to COpenHoldemApp::InitInstance, and seed 
  now uses higher quality LowPart of QueryPerformanceCounter.  All other instances of
  "srand" have been removed. (Thanks, Miathan) 

- PokerPro: f$play was using value returned from f$call accidentally. This is a cut'n'paste 
  typo that has been corrected.  (Thanks HTC for the bug find & Spew for the code fix)  
  (PokerPro::DoAutoplayer)
  
- PokerPro: when connected to a poker pro server, m_holdem_state[m_ndx].m_title would always
  be blank.  (Thanks to Bozo for the bug find and Spew for the code fix).

- Parsing of money fields was inconsistently applied. Some money fields recognized the "", "k"
  and "m" suffixes, and some did not, for example.  That function has been unified and all
  money fields should behave consistently now.  (Thanks, MrRuder)
  - the dollar sign ($) leader is discarded
  - commas are discarded
  - the remaining text is then fed through atof() to generate an internal double
  - the cent symbol () or the letter (c) trailer causes the number to be divided by 100
  - the thousand (k) trailer causes the number to be multiplied by 1000
  - the million (m) trailer causes the number to be multiplied by 1000000 
  
- The stack0-9 symbols were including balances of players not currently playing in the hand.
  This has been corrected.  (Thanks, BrassKnuckles)  (CSymbols::calc_betbalancestack)
  

v1.5.1 2008-02-15
NEW STUFF:
- "File/Load Profile" menu item changed to "File/Load Table Map" (Oops) (Thanks, Folder)


BUG FIXES:  
- ICM prize settings were all being saved to the registry with the 1st prize value.
  (Thanks, Nick Coldhand) (CDlgSAPrefs7::OnOK)

- Code accidentally deleted during merge of Matrix's weighted-prwin functionality has been
  restored.  Thanks to jumpingfences for first identifying the bug, and to Matrix for 
  finding my merging mistake.  (threads.cpp, prwin_thread)
  
- Between the text selection and text deletion action of a swag event, there was a return of
  the cursor to its original position.  This may have been a cause of the strange swag entries,
  but testing is needed to see if there is a difference.  In any case, it has been removed, as
  it is redundant, and the only return of the cursor now happens after the completion of the
  entire swag event.  (Autoplayer::do_swag)
  

v1.5.0 2008-02-08
NEW STUFF:
- Formula Editor (Code by Spew)
  - Added Find Next/Prev to the Edit menu
  - Added F3 and Shift F3 shortcuts for Find Next/Prev 
  
- Merged Matrix's alternative weighted-prwin code to the project:

This is the model implemented in the weighted prwin. The two most important points are f$willplay,
the handrank169 value below which opponents will almost certainly play cards; and f$wontplay, the 
value above which they are highly unlikely to play. Two further values are provided to allow for 
simulation of the case where with low pre-flop betting good cards start to be less likely merely 
to be called (f$topclip), but the very best hands might be slowplayed to tease more out of the 
pot (f$mustplay).

p |---|    ---------
r |   |   /         \
o |   |  /           \
b |   | /             \
a |   |/               \
b |                     \
l -----------------------------------------------------
e     1    2       3     4     handrank169 ->
1=mustplay
2=topclip
3=willplay
4=wontplay
(with the current statistics available in OH only willplay and wontplay should be used. mustplay 
and topclip are debatable constructs at the best of times)

Ideally you would base the calculations of these points on the statistics for opponent betting 
pre-flop at various bet levels. This information is not currently available from OH (unless you use
the PokerTracker capabilities), but the single most useful statistic, SingleMalt's floppct, can 
be used. Using this to set f$willplay and f$wontplay gives the major advantage which a weighted 
prwin gives; the elimination of rags from the iterator calculations. A starting point might be 
something like:

##f$willplay##
handsplayed<10?72:180*floppct

##f$wontplay##
f$willplay*1.4

If f$willplay is absent, or returns zero, the prwin weighting is disabled, as it is if the f$P is 
greater than 13. The calculation will not weight the cards for an opponent who is BB and has limped 
into the flop. f$willplay will be increased internally if it is so low that the iterator cannot assign 
cards for all opponents from the available matching hands. 



BUG FIXES:  
- Manual replay frame shooting: Sometimes, OH will hang indefinitely while waiting for threads to
  finish, when snapping a manual replay frame (camera toolbar icon).  Put hard stop in code to avoid
  an endless wait. (CGlobal::create_replay_frame)

- f$ function results were sometimes being cached in the Formula Editor's working set inappropriately,
  and resulting in stale values being presented in the dialog.  All working set f$ functions are now
  set to "stale" upon each click of the "Calc" button, and on every update of f$debug when it is set
  to "Auto" mode.  (Thanks, DonPauleone)  (CDlgFormulaScintilla::OnBnClickedCalc, and
  CDlgFormulaScintilla::update_debug_auto)
  
- This is not a bug, just code cleanup.  Moved the following code out of the inner loop in 
  CSymbols::calc_nhands.  (Thanks, Thrillhouse)
CardMask_OR(playerEvalCards, plCards, comCards);
hv_player = Hand_EVAL_N(playerEvalCards, nplCards+ncomCards);
pl_pokval = calc_pokerval(hv_player, nplCards+ncomCards, &dummy, CARD_NOCARD, CARD_NOCARD);

- Added default case to switch statement in COpenHoldemView::draw_card.  (Thanks, jumpingfences)

- vs$xx$prwin/los/tie now works correctly in rounds other then br==1.  Internal counters were not being
  reset for br==2,3,4.  (Thanks, Brass Knuckles)  (CVersus::get_counts)


v1.4.4 2008-02-01
NEW STUFF:
- Hand Lists can now contain comments.  Comment lines are prefaced with the standard double forward 
  slash "//".  The hand list parsing function has been made more efficient in its processing and by 
  using pointer arithmetic instead of Mid().  The hand list parsing function has also been moved to 
  CGlobal::ParseHandList, as there was duplicate code contained in the Formula dialog to handle the 
  Hand List dialog.  (Code by Spew)
  
- Formula Editor: (Code by Spew)
  - Added keyboard shortcuts to take advantage of Scintilla Bookmarks Ctrl-F2 to set, F2 to go to next, 
    Shift-F2 to go to previous.  (Code by Spew)
  - Added modeless Find dialog. Implemented such that you can always bring it up but it only works if 
    you have a valid Formula/Hand List active (But you can have the focus on the tree control).  
  - Cleaned up Formula dialog code with respect to enabling and disabling. Previously the enabling or 
    disabling of the UI was interspersed in the various functions that dealt with user input. All the 
    enables/disables are consolidated in one function that will assess the state of dialog and enable 
    all the controls/menus/toolbars/etc as necessary.

- Per BillW, commented out loading of i$ records from a profile, until the time when the "Image"
  transform is enabled in OH code. (profile.cpp, load_profile)
  
- Per BillW, removed Save Profile code, as there is no need for this in OpenHoldem any longer, as all
  this functionality is contained within OpenScrape.  (profile.cpp, profile.h)
  
- Replay frame creation:
  - Settings for replay frame creation can be found in the preferences dialog.
  - Press the camera toolbar button on the main window, or use the "View/Shoot Replay Frame" menu option
    to create a new replay frame at any time you want, provided that you are connected to a poker window.
  - Replay frames are 100% compatible with whreplay.exe; we fully expect to develop a whreplay
    replacement in the near future, but this will do for now.  In order to use whreplay, either:
      1. OpenHoldem and whreplay must exist in your winholdem install folder, or
      2. You must change the HKCU/Software/WinHoldEm/InstallFolder registry key to point to the location of your
         OpenHoldem directory.
    The reason for this is that whreplay uses the value of the HKCU/WinHoldEm/InstallFolder registry key
    as the base of the file path in which it looks for the "replay" directory.  So when you fire up
    whreplay, press F2, and enter your session.frame number, it will look in the "InstallFolder" path
    for that session and frame.  Personally, I just created that key, pointed it to my OpenHoldem
    directory, and dropped whreplay.exe in my OpenHoldem directory - easy peasy.  Of course, WinHoldem
    is not even installed on my machine any more, so your mileage may vary.   

- Autoplayer SWAG: WinHoldem only supported one option for tuning SWAG action; swag delay.  Up to this point, 
  OpenHoldem only supported the one tuning option as well.  As of this release, there are now 3 settings:
  1. Delay between text selection and text deletion (default 400 ms)
  2. Delay between text deletion and swag amount entry (default 400 ms)
  3. Delay between swag amount entry and bet confirmation action; this is the old "swag delay" (default 700 ms)
  
- Autoplayer allin: As we continue to remove support for the legacy WinHoldem allin (slider) functionality,
  we are removing the ability to edit "Allin Delay" in Edit/Preferences/Autoplayer in this release.  This value 
  is not used anywhere within the OH code base anyway.
  
      
BUG FIXES:  
- As OH becomes more widely deployed, in multi-table situations, there have been some reports of accidental 
  movement of other windows on the screen when the OH autoplayer acts.  OH internally uses a system-wide mutex
  to prevent this from happening - no OH instance can interfere with anout OH instance.  However, when you add
  hoppers and other programs/scripts to the mix, there very well can be collisions.  In this build, I have added 
  a mouse movement back to the original position at the end of every input queue.  A SetCursorPos was always 
  executed after the execution of an input queue, this last mouse movement is just for safety purposes. Hopefully 
  this will make it better, however if this does not solve the problem, then the only solution may be to have 
  hopper scripts utilize the same system-wide mutex that OH uses.  (Autoplayer.cpp)  (Thanks, Folder)
  
- Symbol "elapsedauto" corrected to reset to zero after autoplayer action.  (Autoplayer.cpp) (Thanks, Zippy)

- In CGlobal::capture_state, changed the copying of the title to the state structure to use a strncpy instead
  of a strcpy.  This will protect against buffer overruns with long titles.  (Thanks, Spud)
  
- Formula Editor: During the cleanup I noticed that if you press the New/Rename buttons and Canceled the dialog would 
  incorrectly switch your focus to the tree control and mark the Formulas as modified (so you were 
  incorrectly prompted to apply when closing). This has been fixed. (Bug identification and code fix by Spew)
  

v1.4.3 2008-01-25
NEW STUFF:
- Added File/Connect menu option.  This performs the same function as clicking on the
  green button.  (Thanks, Nick Coldhand)
  
- Added View/Sort UDF's menu option to the Formula Editor.  Its function is self-explanatory,
  I hope.
  
- Formula Editor: expanded/not-expanded states of formula tree nodes are now saved between sessions.

- Formula Editor: when Apply or OK is pressed, the warning that pops up will now *ask* if you want to
  disable the autoplayer, rather than assuming you want to do so and just do it.  (Thanks, Matrix)
  
- Nick Coldhand found a site that requires more than the 3 chip stacks currently supported by the
  chip scraping engine.  The maximum number of stacks that can be scraped is now 10.  The maximum
  number of chips per stack is still 20.  These numbers are #defined in structs_defines.h, btw, if 
  you ever want to change them.  Easy to change/recompile, and you are good to go.
  

BUG FIXES:  
- Fixed problem with bestaction disaply in main window fluctuating rapidly (Thanks, Winngy)
  (CMainFrame::OnTimer)

- Fixed a pretty serious error in grammar.cpp, eval_expression.  Results of recursive calls to
  eval_expression were being casted to a long type, rather than an unsigned long type.  The MSB
  is important in a number of symbols, a good example being pokerval.  To demonstrate the bug,
  put the following in f$debug:
    =onepair&0xff000000
    
  Press calc, and the result will be zero, which is incorrect.  However, this expression returns 
  the expected result, as the MSB is taken out of the equation:
    =onepair&0x7f000000
    
  Another good example is the bitwise not operator (~).  In some cases, the wrong result would be returned:
  ex: "~1" should return "4294967294" (every bit set except the LSB), but was returning "-2", due to the MSB
  being interpreted as the sign.  All casts in eval_expression are now of type unsigned long, which 
  corrects the error.
  
- Formula Editor: Continuing code review and cleanup by Spew:
  a. Replacement of stickybutton class with standard pushbutton-style checkbox
  b. Auto button can now be turned off consistently
  c. Focus stealing when updating the debug tab has been eliminated, thus eliminating the flickering sometimes
     seen when Auto is engaged

- Chip scraping was not using the proper hash seed for the various hash types.  Hash1-Hash3 now use the proper
  type, and chip scraping works again.  (Thanks, UKBotter and Nick Coldhand)  (CScraper::do_chip_scrape)
  
  
  
v1.4.2 2008-01-18
NEW STUFF:
- Added hand list editor dialog to Formula Editor.  (Thanks, SingleMalt, for the code)


BUG FIXES:  
- seatposition symbol corrected to not count empty seats (Thanks, Nick Coldhand)
  (CSymbols::calc_roundspositions)
  
- Weirdness with formula dialog and "Do you want to save your changes?" has been corrected.
  Previous to this fix, if you 1) open the formula editor and make a change, and do not press
  apply/ok, then 2) close the formula dialog, and select "no" to the save question, then 3) reopen
  the formula dialog, it would ask you again if you wanted to save.  (Thanks, Matrix for the
  bug find and Spew for the code fix) (CDlgFormulaScintilla::OnBnClickedCancel,
  CDlgFormulaScintilla::DestroyWindow)
  
- An issue existed where saving your forumula would add extra blank lines to the whx file (but not
  the whf file).  This has been corrected, and all extra blank lines that may have been added over
  time will be removed the next time you open and save the formula file.  (Thanks, Spew for the
  code fix)  (COpenHoldemDoc::ReadFormula, COpenHoldemDoc::WriteFormula)

- Chip scraping is now displayed in scraper output window correctly.  (Thanks, radi8tor for the bug
  find and UKbotter for the code fix)  (CScraper::scrape_pots)
  
- Chip scraping had a bug with identification and handling of horizontal and vertical stride regions.
  (Thanks, UKbotter for the bug find and code fix)  (CGlobal::save_r$indexes)



v1.4.1 2008-01-11
NEW STUFF:
- Logging; on a hand reset, the title text from the table is now recorded in the log.  This
  should help identify the proper log entries, especially if you do not have a casino/table map
  that supports handnumbers.
  

BUG FIXES:  
- ICM
  - Player balances are now captured at the beginning of each hand for use by the ICM
    calculator; this happens in CSymbols::CalcSymbols, and is stored in the CSymbols
    class.
  - Removal of ICM::IsResetHandState, ICM::IsBalanceKnown, ICM::GetPlayerBalance, and
    ICM::GetPlayerLastBalanceKnown as these methods have been rendered moot by the 
    above point.
  - ICM::GetPlayerCurrentBet method removed and replaced with a direct reference to the values
    stored in the CSymbols class.
    
- Improved time of Green Button to find tables.  This function was coded really early on in
  the OpenHoldem project and has not been revisited in a long time.  It was loading every
  .tm/.ws file in the scraper folder once for each candidate window on the screen, thus
  there was a geometric relationship between the number of windows times the number of table maps 
  and the time it took the Green Button to finish it's work.  The relationship is now linear as
  related to the number of .tm/.ws files in the scraper folder.
  (CMainFrame::OnBnClickedGreenCircle; profile.cpp, EnumProcTopLevelWindowList)
  (Thanks, Nick Coldhand).
  
- In the Formula Editor dialog, undo stacks are now properly maintained for each individual
  formula in the set.  Previously, you could make a change to one formula, switch to another
  formula, press undo (Ctrl-z) and see the changes that were made in the other formula be undone
  in the new formula.  (CFormulaScintilla class)  (Bug identification and code fix by Spew)
  
- Per WinScrape specs, the maximum width of any given individual character in a text 
  transform field is 31 pixels.  Changed MAX_SINGLE_CHAR_WIDTH in structs_defines.h from
  30 to 31 to account for this.
    

v1.4.0 2008-01-04
NEW STUFF:
- File/Convert Profile (Ctrl R) has been removed from OpenHoldem.  Please use
  OpenScrape to convert your WinScrape profiles to OpenScrape table maps for
  use with OpenHoldem.
  
- OpenHoldem now defaults to looking for .tm files rather than .ws files.  It can
  still load old converted WinScrape profiles (converted by old versions of OpenHoldem), 
  but to ensure maximum forward compatibility, you should convert these to OpenScrape's 
  table map format.  At some point, the ability to load old converted WinScrape profiles
  will probably be removed. 
  
  1. The behavior when pressing the green circle button is that OpenHoldem will search
     first for .tm files in the scraper directory, then for .ws files.
  2. The behavior when choosing File/Load Profile is to present a file selector box
     with *.tm as a file mask.  You can chose "All Files" from the "Files of type" 
     dropdown in the file selector box if you want to manually load an old WinScrape
     profile that has been converted by an older version of OpenHoldem.

- Option added to Edit/Preferences, PokerTracker, to entirely disable the PokerTracker
  thread within OpenHoldem.  Please note that if you are currently using PokerTracker
  functionality, you *must* go into Edit/Preferences and uncheck the "Disable
  all PokerTracker access" box, otherwise your PokerTracker symbols will not work.  This
  setting will be saved, and must only be done this one time to get the entry set up
  in the registry properly.
  
- Added ICM calculator (thanks, Spud, for the code donation; thanks Nick Coldhand for the
  idea donation).  This should very much be considered beta code, and the results should
  be carefully validated before using in a production bot.  Jump into the "OpenHoldem
  Discussion" forum with your thoughts.
  
  1. Settings can be found under Edit/Preferences, ICM
  2. New symbols:
    - icm : my tournament equity before any action is considered (just balances)
	- icm_fold : my tournament equity if I fold
	- icm_callwin : my tournament equity if I call and win
	- icm_calllose: my tournament equity if I call and lose
	
	- icm_alliwin0: my tournament equity if I push all-in and nobody call
	- icm_alliwin1: my tournament equity if I push all-in and win against one caller
	- icm_alliwin2: my tournament equity if I push all-in and win against two callers
	  ...
	- icm_alliwin9: my tournament equity if I push all-in and win against nine callers
	
	- icm_allilose1: my tournament equity if I push all-in and lose against one caller
	- icm_allilose2: my tournament equity if I push all-in and lose against two callers
	  ...
	- icm_allilose9: my tournament equity if I push all-in and lose against nine callers 
     
- Added option to start autoplayer automatically upon identification of userchair.  Setting
  can be found in Edit/Preferences, Autoplayer.  If you manually turn off the autoplayer,
  then you must press the Red Circle button to disconnect from the table, then press the
  Green Circle button to reconnect to a table for the automatic autoplayer start to be
  effective again.
  
- Div/0 errors are now trapped while working in the formula editor and will no longer cause
  a OpenHoldem crash.  As of this release, div/0 errors will not affect the autoplayer, 
  however in a future release we may consider halting the autoplayer in a div/0 situation.
  
- Relaxed retriction on when currentbetx is recorded.  Previously, it would not record
  currentbet for a seat unless the number of opponents (cardbacks) was greater than zero,
  and the total pot was greater than zero.  Some sites do not update the total pot in a
  reliable field until the individual bets are swept in between betting rounds. (Full Tilt).
  The total pot > 0 restriction has been removed.  (CSymbols::calc_betbalancestack)
  
- Ability to engage the prefold button has been added.  There are several steps to accomplish
  this:
  1. In your table map, define any button, label and state region for the prefold button
     - The label should probably be a hash, and it needs to return "prefold" as the result
     - The button defines the clickable region
     - The state should return "yes" or "true" when it is available to be checked.  In other
       words, yes/true will indicate the unchecked state of the button.
  2. Write a formula for f$prefold that returns a non-zero result when the pre-fold button
     should be pushed.  As an example, this expression would click the pre-fold button only
     in betting round one when our hole cards are in the bottom third of the handrank2652 list:
     "br==1 && nplayersdealt>4 && handrank2652>2652*0.66 && !currentbet && !f$swag && !f$rais && !f$call"
  
  

BUG FIXES:  
- Settings dialog (from Formula Editor) has been replaced in the code base.  It was 
  removed accidentally as part of the great "Edit/Preferences" overhaul in v1.2.1.
  Oops.  (Thanks, dipitlow)

- Game Type dropdown in the Lock Blinds dialog has been resized to allow all options
  to be seen without scrolling. (CDlgLockBlinds::OnInitDialog)  (Thanks, HTC)

- Multiple 'calc' presses on the formula editor was not forcing a re-parse of the
  selected function if multiple changes were made between presses.
  (CDlgFormulaScintilla::LastChangeToFormula)
  
- Backtick operator (`) now shows up in black text on a white background, instead of
  white text on a white background.  (CDlgFormulaScintilla::set_style_colors)
  (Thanks, dipitlow)
  
- npcbits/pcbits symbols were sometimes reporting incorrect values.
  (CSymbols::calc_pokerval)  (Thanks, dipitlow)
  
- Clicking on the system close button ("X") on the main window would shut down
  OpenHoldem even if there were un-applied and unsaved changes in an open
  formula editor.  A warning now pops up that confirms this action.
  
- Updating of f$debug tab (when Auto/Calc pressed) was sometimes colliding with threads 
  from the formula editor dialog.  Updating of f$debug has been moved from the heartbeat
  thread to a timer in the Formula Dialog window thread.  
  (threads.cpp, heartbeat_thread and CDlgFormulaScintilla::OnTimer)
  

v1.3.1 2007-12-28
NEW STUFF:
- Support for reading OpenScrape table maps added.  
  Note:  As of next week's release, support for converting WinScrape profiles will be 
  removed.  OpenScrape will be the tool for conversion of WinScrape profiles going forward.


BUG FIXES:  
- Added check for valid PokerTracker connection prior to attempting database queries.
  (pokertracker.cpp, pokertracker_thread())  (Thanks, BillW)
  
- Fix identified by BillW for handnumber not incrementing has been applied.
  (CScraper::parse_string_bsl)
  
- A few HeapAlloc's did not have matching HeapFree's in situations of early return from
  the enclosing function.  This should only be applicable in rare situations, but 
  nevertheless should help stability.
  (profile.cpp, check_window_match(), CScraper::h_transform, CScraper::t_transform)
  
- Tree on Formula Editor changed to show selected item, even when focus moves elsewhere.
  (formula dialog, "Always Show Selection" property set to true)
  
- Small non-important typo fixed in convert_profile:  "if (hash_type>=0 && hash_type<=4)"
  changed to "if (hash_type>=0 && hash_type<=3)", as there is no such thing as a type 4
  hash.  This would never be encountered in real life, but we like clean code.
  (profile.cpp, convert_profile())
  
- Small non-important fix in CScraper::parse_string_bsl, in roman numeral handling section.
  Added 'token = "";' to initialize variable prior to parsing roman numerals.  Not important
  yet, as roman numerals are just thrown away.  However, should OpenHoldem implement a
  "tournlevel" symbol or something similar in the future, this will become relevant.
  
- Change to handling of swagging in autoplayer.  Previously, if f$swag evaluated to >0, then
  OH would try to swag regardless of the presence of the swag edit field or not (essentially
  it was ignoring the i3state region).  It now will try to swag only if i3state returns true.
  If f$swag>0 and i3state is not true, then the autoplayer will try to raise/call/check/fold
  in that order depending on the value of the f$ symbols and the presence of buttons.
  (Autoplayer::do_autoplayer)  (Thanks, Winngy)



v1.3.0 2007-12-21
NEW STUFF:
- Added busy cursor for long running operations, such as loading a very large formula set.

- Added message box to indicate when autoplay has been disabled due to a change in the active
  formula set.
  
- Added new menu option (DLL/Load Specific File) for those times when you just want to override
  all the automatic stuff and choose the DLL file manually.
  
- WaitForMultipleObjects used instead of WaitForSingleObject when applicable to speed up
  response time when waiting for threads to shutdown.  This usually happens when clicking
  the red button, for example.
  
- Behavior changed for sending state information to the DLL.  When the player is not playing
  (userchair does not have card faces) then the state will not be sent to the DLL any more.  This
  behavior is toggleable via a preference setting in Edit/Preferences/DLL Extension.
  [Note: This has the potential for massive performance improvement if you are a DLL user]

- PokerTracker integration is complete (functionality from SingleMalt's DLL)
  - Edit/Preferences/PokerTracker to set it up
    a. The "update delay" parameter is much like the core heartbeat thread.  Every so often, as
       determined by this number of seconds, the PokerTracker thread will wake up and do it's
       stuff.  This does not need to happen very often, as the information in PokerTracker
       does not change that often itself.
    b. The "cache refresh" parameter determines when the results from a PokerTracker query become
       stale and should be re-queried from the database.  Again, the information in PokerTracker
       does not change often enough for this to be a particularly low value.
  - Note: This feature requires a working PokerTracker installation using PostgreSQL as the backend
    database, and preferably using PT's auto-import to load the hand histories into the
    database.  Please see the Poker Tracker forums on information on how to accomplish all
    this.  (Microsoft Access as a backend database is not supported and likely never will be)
  - New symbols:
		Poker Tracker Ring symbols
		---------
		pt_iconx (x=0-9)       - Poker Tracker auto-rate icon code for chair x
		pt_iconlastrx (x=1-4)  - Poker Tracker auto-rate icon code for the last raiser in round x
		pt_pfrx (x=0-9)        - Poker Tracker pre-flop raise percentage for chair x
		pt_aggtotx (x=0-9)     - Poker Tracker total aggression for chair x
		pt_aggtotnopfx (x=0-9) - Poker Tracker total aggression excluding preflop for chair x
		pt_aggpx (x=0-9)       - Poker Tracker preflop aggression for chair x
		pt_aggfx (x=0-9)       - Poker Tracker flop aggression for chair x
		pt_aggtx (x=0-9)       - Poker Tracker turn aggression for chair x
		pt_aggrx (x=0-9)       - Poker Tracker river aggression for chair x
		pt_floppctx (x=0-9)    - Poker Tracker saw flop pct for chair x
		pt_turnpctx (x=0-9)    - Poker Tracker saw turn pct for chair x
		pt_riverpctx (x=0-9)   - Poker Tracker saw river pct for chair x
		pt_vpipx (x=0-9)       - Poker Tracker VP$IP for chair x
		pt_handsx (x=0-9)      - Poker Tracker number of hands that are in the database for chair x
		pt_pf_rfix (x=0-9)     - Poker Tracker "pre-flop raise first in" pct for chair x
		pt_pf_crx (x=0-9)      - Poker Tracker "pre-flop called raise" pct for chair x
		pt_pfatsx (x=0-9)      - Poker Tracker attempt to steal blinds for chair x
		pt_wsdpx (x=0-9)       - Poker Tracker went to showdown percentage for chair x
		pt_wssdx (x=0-9)       - Poker Tracker won $ at showdown for chair x
		pt_fsbtsx (x=0-9)      - Poker Tracker folded small blind to steal for chair x
		pt_fbbtsx (x=0-9)      - Poker Tracker folded big blind to steal for chair x 

		Poker Tracker Ring symbols for the "raischair"
		---------
		pt_ricon       - Poker Tracker auto-rate icon code for raise chair
		pt_rpfr        - Poker Tracker pre-flop raise percentage for raise chair
		pt_raggtot     - Poker Tracker total aggression for raise chair
		pt_raggtotnopf - Poker Tracker total aggression excluding preflop for raise chair
		pt_raggp       - Poker Tracker preflop aggression for raise chair
		pt_raggf       - Poker Tracker flop aggression for raise chair
		pt_raggt       - Poker Tracker turn aggression for raise chair
		pt_raggr       - Poker Tracker river aggression for raise chair
		pt_rfloppct    - Poker Tracker saw flop pct for raise chair
		pt_rturnpct    - Poker Tracker saw turn pct for raise chair
		pt_rriverpct   - Poker Tracker saw river pct for raise chair
		pt_rvpip       - Poker Tracker VP$IP for raise chair
		pt_rhands      - Poker Tracker number of hands that are in the database for raise chair
		pt_rpf_rfi     - Poker Tracker "pre-flop raise first in" pct for raise chair
		pt_rpf_cr      - Poker Tracker "pre-flop called raise" pct for raise chair
		pt_rpfats      - Poker Tracker attempt to steal blinds for raise chair
		pt_rwsdp       - Poker Tracker went to showdown percentage for raise chair
		pt_rwssd       - Poker Tracker won $ at showdown for raise chair
		pt_rfsbts      - Poker Tracker folded small blind to steal for raise chair
		pt_rfbbts      - Poker Tracker folded big blind to steal for raise chair

		Poker Tracker Tournament symbols
		---------
		ptt_iconx (x=0-9)       - Poker Tracker auto-rate icon code for chair x
		ptt_iconlastrx (x=1-4)  - Poker Tracker auto-rate icon code for the last raiser in round x
		ptt_pfrx (x=0-9)        - Poker Tracker pre-flop raise percentage for chair x
		ptt_aggtotx (x=0-9)     - Poker Tracker total aggression for chair x
		ptt_aggtotnopfx (x=0-9) - Poker Tracker total aggression excluding preflop for chair x
		ptt_aggpx (x=0-9)       - Poker Tracker preflop aggression for chair x
		ptt_aggfx (x=0-9)       - Poker Tracker flop aggression for chair x
		ptt_aggtx (x=0-9)       - Poker Tracker turn aggression for chair x
		ptt_aggrx (x=0-9)       - Poker Tracker river aggression for chair x
		ptt_floppctx (x=0-9)    - Poker Tracker saw flop pct for chair x
		ptt_turnpctx (x=0-9)    - Poker Tracker saw turn pct for chair x
		ptt_riverpctx (x=0-9)   - Poker Tracker saw river pct for chair x
		ptt_vpipx (x=0-9)       - Poker Tracker VP$IP for chair x
		ptt_handsx (x=0-9)      - Poker Tracker number of hands that are in the database for chair x
		ptt_pf_rfix (x=0-9)     - Poker Tracker "pre-flop raise first in" pct for chair x
		ptt_pf_crx (x=0-9)      - Poker Tracker "pre-flop called raise" pct for chair x
		ptt_pfatsx (x=0-9)      - Poker Tracker attempt to steal blinds for chair x
		ptt_wsdpx (x=0-9)       - Poker Tracker went to showdown percentage for chair x
		ptt_wssdx (x=0-9)       - Poker Tracker won $ at showdown for chair x
		ptt_fsbtsx (x=0-9)      - Poker Tracker folded small blind to steal for chair x
		ptt_fbbtsx (x=0-9)      - Poker Tracker folded big blind to steal for chair x 

		Poker Tracker Tournament symbols for the "raischair"
		---------
		ptt_ricon       - Poker Tracker auto-rate icon code for raise chair
		ptt_rpfr        - Poker Tracker pre-flop raise percentage for raise chair
		ptt_raggtot     - Poker Tracker total aggression for raise chair
		ptt_raggtotnopf - Poker Tracker total aggression excluding preflop for raise chair
		ptt_raggp       - Poker Tracker preflop aggression for raise chair
		ptt_raggf       - Poker Tracker flop aggression for raise chair
		ptt_raggt       - Poker Tracker turn aggression for raise chair
		ptt_raggr       - Poker Tracker river aggression for raise chair
		ptt_rfloppct    - Poker Tracker saw flop pct for raise chair
		ptt_rturnpct    - Poker Tracker saw turn pct for raise chair
		ptt_rriverpct   - Poker Tracker saw river pct for raise chair
		ptt_rvpip       - Poker Tracker VP$IP for raise chair
		ptt_rhands      - Poker Tracker number of hands that are in the database for raise chair
		ptt_rpf_rfi     - Poker Tracker "pre-flop raise first in" pct for raise chair
		ptt_rpf_cr      - Poker Tracker "pre-flop called raise" pct for raise chair
		ptt_rpfats      - Poker Tracker attempt to steal blinds for raise chair
		ptt_rwsdp       - Poker Tracker went to showdown percentage for raise chair
		ptt_rwssd       - Poker Tracker won $ at showdown for raise chair
		ptt_rfsbts      - Poker Tracker folded small blind to steal for raise chair
		ptt_rfbbts      - Poker Tracker folded big blind to steal for raise chair
  

BUG FIXES:  
- GetDIBits is one evil function.  It was causing some random stack corruptions.  Memory allocation
  for functions that require GetDIBits now allocate memory off of the process heap, rather than from
  the stack.  This has solved the problem.
  
- Main window was displaying best action, even when f$P evaluated to zero.  Main window will now display
  "Idle (f$P==0)" in this situation.  (CMainFrame::OnTimer)  (Thanks, Winngy)
  
- Was incorrectly sending m_name_known and m_balance_known bits to the DLL. (CScraper::scrape_name,
  CScraper::scrape_balance)  [Note: This has the potential for massive performance improvement if you
  are a DLL user and look at changes in state to know when to do your processing]

- All CString::Tokenize calls changed to accept both spaces and tabs as delimiters.  (profile.cpp, 
  symbols.cpp)  (Thanks, TheHighFish)
  
- Tweaked formula editor dialog to work more like the sandbox that it was intended to be.  Specifically,
  pressing "calc" will use whatever is in the edit window at that moment - it does not require "Apply" to
  be pressed first.  Edits that are made in the editor do not get applied to the main formula until
  "Apply" or "OK" is pressed.  One thing you may notice is that because the "active" formula set is very
  distinctly separate from the "sandbox" forumla set, OH will need to reparse the "sandbox" formula set
  when you "calc" or "auto".  Here's how OH works:
  1. You start up OH, it finds your last used formula set, opens it into the "active" set and parses it
  2. You open up the formula editor, OH copies the formula text into the "sandbox" set (it does not
     copy the parse results from the active set for several reasons, most of which are obscure technical
     ones.  PM me if you want more detail.)
  3. You press "calc" or "auto", OH parses all the formula text in the "sandbox" set and then proceeds
     as usual.
  Bottom line is that sometimes you may have to wait a moment for the "sandbox" set to get parsed the 
  first time you press "calc" or "auto".  Not a big deal, unless you have a very large formula (which is
  the case for one of Lab 1's bots, which has over 11,000 lines of OH-script code, and takes 45-60
  seconds to parse).
  

v1.2.2 2007-12-14
NEW STUFF:
- You might notice some PokerTracker capabilities starting to show up in various places.  Please
  ignore these features for this release as they are not fully baked and tested yet.  This is expected
  to be ready for prime time in next week's release.

BUG FIXES:  
- Best action was not being displayed properly in main window.
- Scraper engine was not properly handling the alpha channel for color separation. (scraper.cpp,
  profile.cpp)  (Thanks Winngy for initially identifying the bug, thanks BillW, Tinkerer, Indiana
  Winngy, TheHighFish, and Matrix for chiming in on the discussion thread and for contributing
  to the solution)
- Correction to normalized random distribution algorithm, per Indiana (Autoplayer::randomNormalScaled)
- srankbitsplayer, srankhiplayer, srankloplayer now returning correct values (CSymbols::calc_rankbits)
  See discussion here for more info: http://maxinmontreal.com/forums/viewtopic.php?t=2592
  (Thanks, Tinkerer)
  

v1.2.1 2007-12-07
NEW STUFF:
- Added "caching" for f$ symbols.
  OH will now cache f$ symbol results, and refer to the cache for queries to the same symbol in 
  the same cycle.  Each cycle, the cache will be flushed to force a recalc of each f$ symbol.  
  
  We are not caching dll$ symbols, because that is just foolish and asking for trouble--a lot of 
  DLL's rely on various symbol timings for their activities, and it is best not to mess with that.  

  We also are not adding the new goofy symbols that Ray has proposed for WH (scnage, scnhit, scnmiss, 
  scnused) as their only purpose is as a developer's debugging aid, and have zero value to the 
  OH-script bot writer.

  Performance improvements are on an order of 3 orders of magnitude for individual symbols.  Open up 
  the formula editor (don't connect to a table), choose a f$ function and click calc.  Note the timing 
  at the top of the dialog. Click calc again, note timing.  The first click calculated the f$ function 
  since the cache was dirty, the second click used the cached value.

  New function in grammar.cpp called calc_f$symbol and changed references throughout.  (Thanks, Ray!)

- New Edit/Preferences dialog.  The other one was getting crowded, so we created a new fancy-schmancy one.

- A new .whf section called "##dll##" is now supported.
  The implementation is slightly different than WH's, due to the fact that in OH, the dll's name to be
  loaded can be set in prefs. OH will use this decision path to determine
  which dll to load:
  A. On startup:
     1. Is "Load DLL on startup" ticked in Edit/Preferences? 
        a. If yes, then try to load the DLL file specified in the ##dll## section
        b. If yes and "a." fails, then try to load the dll specified in Edit/Preferences
     2. If "Load DLL on startup" is not ticked, then do nothing.
  B. On DLL/Load:
        c. Try to load the DLL file specified in the ##dll## section
        d. If "c." fails, then try to load the dll specified in Edit/Preferences  

- The PokerEval library and selected source code (only that part that is required for OpenHoldem)
  is now included within the source code archive. This was done to ensure consistency of the compilation 
  of the .lib file for those who choose to roll their own version of OpenHoldem.

BUG FIXES:  
- Random crashes in Autoplayer::check_bring_keyboard.  Changed from dynamic memory allocation
  in the function to static memory allocation.  (Thanks, SingleMalt).

- added "#include "debug.h" directive to RunRon.cpp (Thanks, A_K_A)

- View/Scraper Output and Edit/Formula not working (toolbar buttons work fine).  Fixed dialog
  allocation in CMainFrame::OnEditFormula and CMainFrame::OnScraperOutput)
  (Thanks, Spektre and TheHighFish)

- Modified heartbeat_thread to only call the dll$is_wait symbol when ismyturn is true.
  (Thanks, Tinkerer)

- Fixed bug whereby iXlabelY regions were not being handled.  (CScraper::scrape_buttons)
  (Thanks, BillW)

- Forgot to account for new hash seeds for H1-H3 transforms in scraper engine.  Duh. <smack>
  (CScraper::h_transform) (Thanks, Tinkerer)

- pcbits was not including the kicker in certain two pair hands.  QhJc/Qc9c2d2s for example, was
  returning "16" for pcbits, when "17" was the correct answer. (CSymbols::calc_pokerval) 
  (Thanks, Tinkerer)
  
  

v1.2.0 2007-11-30
-----------------
IMPORTANT: Version 1.2.0 and higher of OpenHoldem require a reconversion of existing
           profiles.  Profile hashes have been changed to support the "new" WinScrape
           regions and features.  Please reconvert your master profiles using 
           "File/Convert Profile".  New profile versions will have ".ohdb2" as the first
           line of the converted profile, rather than ".ohdb1" as in previous versions.
           
NEW STUFF:
- Profiles using the following new WinScrape features (version "2007 Nov 1 08:32:55") are
  supported.
  - t0$, t1$, t2$ and t3$ font records (plain, no fuzzy handling yet)
  - c0cardface0rank to c0cardface4rank
  - c0cardface0suit to c0cardface4suit 
  - p0cardface0rank to p9cardface1rank
  - p0cardface0suit to p9cardface1suit 
- Scraper output dialog added.  Use the "View/Scraper Output" menu item, or the toolbar 
  button that looks like a scraper (yes it does).
- "ismanual" now returns "1" if attached to an OpenHoldem Manual Mode table.  This
  requires v1.0.1 or greater of the OpenHoldem Manual Mode application.  (Thanks, 
  Tinkerer)
- Added progress dialog for use when loading/parsing large formula sets. (Called in
  CGlobal::ParseAllFormula)
- When loading a profile, h$ records do not need to be sorted in the .ws file - they 
  will be sorted internally (for binary searches) upon load.  (profile.cpp, load_profile)
  

BUG FIXES:  
- Updated handnumber parser to accept dash "-" characters in the string.
  (CScraper::parse_string_bsl)  (Thanks, BillW)
- If OH was atttached to the bottom or top of a window, and that window disappears, OH
  would disappear from the screen as well.  (CMainFrame::OnTimer) (Thanks, dipitlow)
- isfinalanswer was not being set when it truly was final.  It is now set in 
  Autoplayer::do_autoplayer, after the number of stable frames have been seem, instead 
  of in heartbeat_thread().  (Thanks, Tinkerer)
- did[chec/call/rais/swag]round[1/2/3/4] were returning invalid results.  Actually, the
  symbols were off by one round.  Example, in CSymbols::GetSymbolVal, this line:
  if (memcmp(a, "didchecround", 12)==0 && strlen(a)==13)  return sym.didchec[a[12]-'0'];
  ...should be this:
  if (memcmp(a, "didchecround", 12)==0 && strlen(a)==13)  return sym.didchec[a[12]-'0'-1];
  (Thanks, Tinkerer & dipitlow)
- didswag, didcall, didchec, didrais changed to increment, rather then be true/false.
  (Autoplayer::do_swag & Autoplayer::do_arccf) (Thanks, Tinkerer)
- didswag, didcall, didchec, didrais were not being reset at the beginning of each round.
  (CSymbols::ResetSymbolsNewRound & CSymbols::CalcSymbols) (Thanks, Tinkerer)
- Increased stack size again, from 4MB to 8MB as we received a very large and complex formula from
  lab 1 that caused stack overflows, even at 4MB.
- Clicking the formula button on the main toolbar (or Edit/Formula) will now prompt you if you have 
  unsaved changes in the formula editor.  (DialogFormulaScintilla.cpp) (Thanks wkbaker)
  

v1.1.1 2007-11-23
-----------------
NEW STUFF:
- Profile conversion - a check has been added to ensure that profiles being converted from
  WinScrape masters are of the "old" version (2006 Aug 7 13:11:37).  New WinScrape versions
  (2007 Nov 1 08:32:55) of WinScrape master profiles are not yet supported by the OpenHoldem 
  scraper engine and will not be able to be converted until the features provided by the 
  new version are supported.

BUG FIXES:  
- nopponentscalling, etc not returning proper values on micro tables (blinds < $1).  Fix by 
  Tinkerer in CSymbols::calc_playersfriendsopponents to change the declaration of the local
  "lastbet" variable from an int to a double.
- Increased stack size from default of 1MB to 4 MB to allow larger formulas.  Some large 
  scripts with deep recursion requirements were causing stack overflows.
- opponentsfoldedbits not returning correct values.  Line 1390 in symbols.cpp - changed 
  "sym.playersplayingbits" to "sym.playersdealtbits".  (Thanks, cidertime) 
  (CSymbols::calc_playersfriendsopponents)
- profile.cpp, check_window_match - titletext0-9 was not being handled properly. (Thanks, BillW)
- Common card information was not being passed to DLL until userchair was identified.
  (CGlobal::capture_state)  (Thanks, TheHighFish)
- Enabling of "Keyboard" item on a Bring window's system menu was not working for non-English
  Windows Operating Systems / newer Bring versions, due to the different sorting order of the 
  menu.  OH now searches for the correct item, rather than assuming the position of the item.  
  (Autoplayer::check_bring_keyboard) (Thanks, dipitlow)
- Handnumbers with characters other than 0-9 were always resulting in the symbol "handnumber" returning
  zero.  (CScraper::scrape_limits, CScraper::get_handnum_from_string) (Thanks, Tinkerer)
  

v1.1.0 2007-11-16
-----------------
NEW STUFF:
- Formula Editor: New menu items ("Debug/Log f$debug" and "Debug/Only when it's my turn") 
  added to formula editor dialog.  If "Log f$debug" is checked, *AND* the "Auto" button 
  is depressed, then OH will write the entire contents of the f$debug tab to a file either:
     - once per cycle, if "Only when it's my turn" is unchecked
     - when ismyturn is true, if "Only when it's my turn" is checked
  If "Log f$debug" is checked, and you press "Calc", the f$debug tab will be written to
  the file as well, again, dependent on the "Only when it's my turn" setting.
  The entire f$debug tab is written in comma-delimited format to a single line in the file,
  which makes it easy to import into Excel or similar for analysis.
    
- SingleMalt's state engine is now incorporated into OpenHoldem.  The following new symbols are 
  exposed to the scripting language:
	History - symbols
	---------
	hi_<sym>x (x=1-4) - the value of the symbol <sym> as of your last turn in betting
    round x.  Example: hi_prwin1 would return prwin as of your last turn in br1.  Valid
    values for <sym> are:
		PROBABILITIES: prwin, prlos, prtie
		CHIP AMOUNTS: balance, balance0, balance1, balance2, balance3, balance4, balance5, 
			balance6, balance7, balance8, balance9, stack0, stack1, stack2, stack3, 
			stack4, stack5, stack6, stack7, stack8, stack9
		POKER VALUES: pokerval, pokervalplayer, pokervalcommon, pcbits, npcbits
		HAND TESTS: ishandup, ishandupcommon, ishicard, isonepair, istwopair, isthreeofakind, 
			isstraight, isflush, isfullhouse, isfourofakind, isstraightflush, isroyalflush, 
			isfiveofakind
		POCKET/COMMON TESTS: ishipair, islopair, ismidpair, ishistraight, ishiflush
		(UN)KNOWN CARDS: nouts, ncardsbetter
		NHANDS: nhands, nhandshi, nhandslo, nhandsti, prwinnow, prlosnow
		FLUSHES SETS STRAIGHTS: nsuited, nsuitedcommon, tsuit, tsuitcommon, nranked, 
			nrankedcommon, trank, trankcommon, nstraight, nstraightcommon, nstraightfill, 
			nstraightfillcommon, nstraightflush, nstraightflushcommon, nstraightflushfill, 
			nstraightflushfillcommon
		RANK BITS: rankbits, rankbitscommon, rankbitsplayer, rankbitspoker, srankbits, 
			srankbitscommon, srankbitsplayer, srankbitspoker
		RANK HI: rankhi, rankhicommon, rankhiplayer, rankhipoker, srankhi, srankhicommon, 
			srankhiplayer, srankhipoker
		RANK LO: ranklo, ranklocommon, rankloplayer, ranklopoker, sranklo, sranklocommon, 
			srankloplayer, sranklopoker
		run$ ron$: ron$royfl, ron$strfl, ron$4kind, ron$fullh, ron$strai, ron$3kind, ron$2pair, 
			ron$1pair, ron$hcard, ron$total, ron$pokervalmax, ron$prnuts, ron$prbest, 
			run$royfl, run$strfl, run$4kind, run$fullh, run$strai, run$3kind, run$2pair, 
			run$1pair, run$hcard, run$total, run$pokervalmax, run$prnuts, run$prbest

	Action symbols
	---------
	lastraisedx (x=1-4) - which chair was the last to raise in round x
	raisbitsx (x=1-4) - which chairs raised in round x
	callbitsx (x=1-4) - which chairs called in round x
	foldbitsx (x=1-4) - which chairs folded in round x
	oppdealt - Trailing indicator for nopponentsdealt

	Table stats symbols
	---------
	floppct - percentage of players seeing the flop for the last y minutes
	turnpct - percentage of players seeing the turn for the last y minutes
	riverpct - percentage of players seeing the river for the last y minutes
	avgbetspf - average number of bets preflop for the last y minutes
	tablepfr - pfr percentage preflop for the last y minutes
	maxbalance - my highest balance during the session
	handsplayed - number of hands played this session
	balance_rankx (x=0-9) - ranked list of player balances (includes players not 
		currently in hand, and includes currentbet for each player as well).  rank0 has highest
		balance.
	Note: the setting for "y minutes" can be found in Edit/Preferences, and defaults
		to 15 minutes.


BUG FIXES:  
- CScraper::scrape_balance; Forgot a "ret = " on this line, probably causing r$pXbalance to
  not work correctly:
  old: do_transform(hdcCompatible, r$index, &text);
  new: ret = do_transform(hdcCompatible, r$index, &text);
- CScraper::scrape_balance; Loosening up of the "T" transform algorithm to allow the engine 
  to return a value, even if there were some misscraped characters in a particular field, has caused
  zero balances to be displayed, usually when r$uXbalance is used.  The balance region is unique in that
  it needs a clear "yes this is a good scrape" or "no this is not a good scrape" when checking through 
  the various balance regions, in order to decide if we need to check the next region type in the list 
  or not.  (region types being r$ubalance, r$uXbalance, and r$pXbalance, in that order).  r$uXbalance 
  was returning a good scrape, but invalid text, and when the text was translated to a float (atof), 
  the end result was zero.  We added a simple check to ensure that the text coming out of the "T" transform 
  is a valid number (CScraper::is_numeric) before accepting the scrape as a good scrape.
  (Thank you, Nick Coldhand) (CScraper::scrape_balance, CScraper::is_numeric)
- islistcall, islistrais, islistalli not working correctly.
  (Thank you Spektre) (CSymbols::calc_listtests)
- DLL: holdem_state was not being handled as a 256 entry circular list, leading to invalid pointers being
  sent to the DLL.
  (Thank you, TheHighFish) (dll_extension.cpp)
- Main window: name/balance was not being displayed if active/seated regions were not used in a profile.
  (Thank you, BillW) (COpenHoldemView::draw_name_box, COpenHoldemView::draw_balance_box)
- titletext did not support numbers with commas (Thanks Nick Coldhand) (CScraper::parse_string_bsl)


v1.0.6 2007-11-09
-----------------
NEW STUFF:
- Nil.


BUG FIX:  
- PPro: prevaction and did* symbols not being populated when connected to a PPro server.  
  (Thanks, Matrix)  (PokerPro::DoAutoplayer)
- Autoplayer: not always raising properly, due to this line:
  "else if (f$rais && (int) symbols.sym.myturnbits&0x2 && rais_but!=-1) {"
  ...which should read:
  "else if (f$rais && (int) symbols.sym.myturnbits&0x4 && rais_but!=-1) {"
  ...as it is bit 3 that indicates a raise button in myturnbits, not bit 2.
  (thank you, leftover) (Autoplayer::do_arccf)
- table identification: cut'n'paste error in r1.0.5 as we moved from spheres to cubes for color separation
  (thanks, Nick Coldhand) (profile.cpp, check_window_match)
- View menu item now properly handles toolbars and status bars
  (thanks TheHighFish)  (MainFrm.cpp)


v1.0.5 2007-11-02
-----------------
NEW STUFF:
- Nil.


BUG FIX:  
- PPro: Memory leak in PPro class.  This was actually by design (poor design, granted).  The information box
  on the ppro dialog contains an ever-increasing list of ppro message history.  Simply put, there is no
  limit on the size of the text in this box.  Eventually it gets too big for Windows.  It is now limited
  to the last 100 lines.  (Thanks, Matrix) (PokerPro::publish)
- PPro: "Leave Table" button now available even if you close and re-open the PPro dialog. (Thanks, Matrix) 
  (CDlgPpro::OnTimer)
- PPro: Clicking on "Disconnect" was not shutting down all threads properly prior to disconnecting, causing
  an occasional crash.  (Thanks, Matrix) (CDlgPpro::OnBnClickedConnectButton)
- PPro: Now handles tournament-mode TMOD, +TM, -TM, and TLOS messages. It is worth noting that the fantastic
  pokerpro server documentation (read: cppro client source code) does not handle these messages either, so
  we had to figure it out ourselves <sigh> (Thank you Spektre) (PokerPro.cpp, PokerPro.h)
- PPro: Previous release broke limit/game type handling in PPro.  This is fixed.  (Thank you Matrix) 
  (PokerPro::DoScrape, CSymbols::CalcSymbols)
- Main Window: When attached to the bottom or top of a poker window, and the poker window subsequently closes,
  OH would being flashing and resizing in pretty interesting ways, due to the fact that the "attach" code
  was still in effect, and trying to find a non-existent window.  The code that checks for a poker window
  that disappears has been augmented to stop the timer that executes the "attach" code, when a window
  does indeed disappear. (Thank you, knightsaces) (CMainFrame::OnBnClickedRedCircle)

BLACK-BOX REVERSE ENGINEERING RE-INTERPRETATION:
- Scraper, radius transforms: The OH development team interpreted "radius" in terms of spheres, as most sane
  people tend to do so.   For foreground color detection, OH was comparing a pixel's color to a color sphere 
  as defined by the color center point and radius as defined for it's particular region.  If it was inside the 
  sphere (with a positive radius) it was a foreground pixel. 
  
  In reality, it appears that WH's transforms actually use "radius" to define a "cube".  The following WH
  "documentation" is bi-polar on the issue, using "sphere" and "cube" interchangeably: 
      "the radius is an rgb color distance within the 3d rgb cube. the rgb cube has dimensions
       [0,0,0]-[255,255,255]. in general the color value defines the center of an rgb sphere 
       and the radius defines size of the sphere. the triagonal distance across the rgb cube 
       interior is about 444; the diagonal distance across the rgb cube face is about 362. the 
       axial distance along the rgb cube edge is 255. the color sphere divides all rgb space 
       into inside colors and outside colors. inside colors are rgb point values inside the 
       color sphere. outside colors are rgb point values outside the color sphere. a color 
       region is seen as true by the uniscraper engine if the average color of the region is 
       inside the defined sphere. outside colors are seen as false."
  The behavior of OH has been changed to match that of what we now know of how WH operates. Specifically, cubes
  are used to determine foreground pixels, rather than spheres.  We still believe "spheres" are more accurate
  and flexible for color differentiation, so maybe this will be a region transformation option at some later time. 
  However, this method is really easier to understand (and to code, which is probably why WH went down this route).  
  
  The new way (as of 1.0.5): The square root of the sums of the squares of the R, G and B differences between the 
  region's color center and your pixel must be <= radius for it to be considered a foreground pixel.  (converse for
  negative radii).  
  Example:
    region color (50, 60, 70), radius 50, pixel color (90, 50, 75)
    r diff: -40, squared = 1600
    g diff: 10, squared = 100
    b diff: -5, squared = 25
    sum of squares = 1725
    sq. root of sum of squares = ~41.5
    41.5 < 50, so pixel is foreground  
  
  This is a large change to the scraper engine, and thus should be carefully tested to make sure it does not break
  something else.  The OH team has tested many profiles, and they all seem to work properly with this change, but that
  is not a guarantee. This change also removes the requirement for the GMTL library, as it was being used only to do 
  the sphere calculations.
  
  [CScraper::is_in_color_cube, CScraper::c_transform, CScraper::t_transform, profile.cpp (check_window_match)]
  (Thank you, leftover)
   

BEHAVIOR CHANGE:
- Scraper "T" transforms: The strictness of the restrictions around "T" transforms has been relaxed in this
  build.  You now tend to get more fluff when doing the "T"s (like the commas, periods, etc.), but it is also 
  more forgiving of irrelevant pixels in the region, and is thus more WinHoldem-like. (CScraper::t_transform)
- Scraper: Scraper will now force a re-parse for limits and game type upon change of titlebar text.
  (CScraper::DoScrape)
   
   
v1.0.4 2007-10-26
-----------------
NEW STUFF:
- Nil.

BUG FIX:  
- Scraper: Large text transform fields could overrun an internal buffer.  Buffer size increased 
         appropriately.  (CScraper::t_transform)
- DLL: Changed source of m_balance and m_currentbet data to come from symbols calculations, rather
       than raw scraper info.  This takes advantage of the fitlering logic in the CSymbols class.
       (CDll::pass_state_to_dll)  (Thank you, Matrix)
- Scraper: Tweaking of balance handling. (CScraper::scrape_balance)
- Scraper: Tweaking of blind detection to be more aggressive in recognizing changes.
  (CScraper::parse_string_bsl, CSymbols::calc_stakes, COpenHoldemView::draw_center_info_box) (thanks Winngy)


v1.0.3 2007-10-23
-----------------
NEW STUFF:
- Nil.

BUG FIX:  
- DLL: Player card information was not being passed to the DLL properly.  (CDll::pass_state_to_dll)   
  (Thank you, Matrix)
- Symbols: Added sanity check for currentbet0-9 when isfl==true.  currentbet0-9 / bet must be <=4.  Also,
  checks for pot>0 or nopponents>0 have been added (CSymbols::calc_betbalancestack)  
  (Thank you, Matrix/SingleMalt)
- DLL: If DLL does not export process_message, OH will no longer crash. (CDll::load_dll)
- DLL: typedef of process_message_t changed to match that which is exported by default from whuser.h
- Profile conversion:  profile converter was assuming case insensitivity in profile files.  This assumptions
  was incorrect, thus if a profile had "Unchecked" and "unchecked" (perfectly valid), then the profile
  converter would report an inadvertent has collision error.  (Thank you, Winngy)
- Symbols: The following "friends" symbols are now populated.  The only "friend" that is counted is the 
  userchair, as OH has no built-in collusion capabilities.  (CSymbols::calc_playersfriendsopponents, and
  DialogFormulaScintilla.cpp [keywords]) (Thank you, Matrix) 
	 - friendsblindbits, nfriendsblind
	 - friendsdealtbits, nfriendsdealt
	 - friendsplayingbits, nfriendsplaying
	 - friendsseatedbits, nfriendsseated
	 - friendsactivebits, nfriendsactive
- PPRO: You can now load/unload DLL's when connected to a PPro server if you are not sitting down.
  (CMainFrame::OnUpdateMenuDllLoad) (Thanks, Matrix!)
- PPRO/FORMULA EDITOR: Updates to dialog information in the formula editor and in the PPro dialog no
  longer steal the focus.  Focus is returned after an update is completed.  
  (CDlgFormulaScintilla::update_debug_auto && CDlgPpro::OnTimer) (Thank you, Matrix)
- DLL: LoadLibrary call now uses full path of DLL when attempting to load a DLL.  It has also been noted
  that to make use of a C# interop DLL, one needs the .Net 2.0 SDK installed, and not just the .Net 2.0
  redistributable.  

  
SOURCE CODE:
- poker-eval.lib and .h files are now included in source package, to remove external build dependency



v1.0.2 2007-10-16
-----------------
NEW STUFF:
- Button to lock blinds.
- Added new symbol "version", that returns current version number of OpenHoldem.
- GWS calls from a DLL can now be of arbitrary complexity.  We don't know exactly what use this is, but it's
  cool nontheless.  And open source is all about "cool", so deal with it.  Example:
  DLL code:
  double process_query( const char* pquery ) {
	if (pquery==NULL)
		return 0;

	if (strncmp(pquery,"dll$test",8)==0)
		return gws("random");

	if (strncmp(pquery,"dll$spend",9)==0)
		return gws("f$spend");

	if (strncmp(pquery,"dll$recurse",11)==0)
		return gws("dll$mynumber");

	if (strncmp(pquery,"dll$mynumber",12)==0)
		return 12345.67;

	if (strncmp(pquery,"dll$complex",11)==0)
		return gws("f$spend/25 * 1.1");

	return 0;
  }
  
  f$debug tab:
      0.7553 = dll$test
      0.7553 = random
     17.7496 = dll$spend
     17.7496 = f$spend
  12345.6700 = dll$recurse
  12345.6700 = dll$mynumber
      0.7810 = dll$complex
      0.7810 = f$spend/25 * 1.1


BUG FIX:  
- Commented out some debugging code in threads.cpp that was creating "prwin algos.txt".  Lines 422-431.
- Cycle timing on main display commented out.  This was intended for debugging purposes only.  OpenHoldemView.cpp, lines 467-470.
- Issue with changing blinds as reported by cq123 is fixed.  Hopefully.  This was a problem with the blind inferrence code
  in CSymbols::calc_stakes.
- Formula editor, f$debug: error lines and comment lines did not have a linefeed at the end, giving the appearance of 
  disappearing lines when calc/auto button is pushed.  (CDlgFormulaScintilla::create_debug_tab)
- Formula editor: calc button result now displays with the same precision as that selected for the f$debug tab 
  (<< and >> buttons). (CDlgFormulaScintilla::OnBnClickedCalc)
- Formula editor, f$debug: fixed stupid bug where "calc" button was returning zero for every line. 
  (CDlgFormulaScintilla::OnBnClickedCalc)
- Formula editor: Versus symbols are now recognized for colorisation purposes.  
- Autoplayer (casino, not PokerPro): added final calculation of f$alli, f$swag, f$rais, f$call, and f$play after setting
  isfinalanswer to true, and before autoplayer acts.
- DLL extension: gws calls now handle f$function calls correctly.


v1.0.1 2007-10-14
-----------------
BUG FIX:  
- Loading a DLL consistently causes a crash.  The OH development team has struggled with MSVC 2005's code
  optimization features thoughout the life of this project.  Something in the code base causes unexpected
  behavior when various optimization options are chosen.  For some reason, choosing "custom" optimization
  and manually turning every option on solves the problem.  Late in the 1.0.0 development cycle, the team
  decided to stay with "full" optimization, as everything appeared to be working properly.  Alas, that was
  clearly not the case.  The only change in this bugfix release is to use a "custom" optimization profile for
  "release" builds.  Debug builds are not impacted, as they use a "disabled" optimization profile.

Thank you to Matrix for identifying out the issue with loading DLL's.

Any advice from MSVC 2005 code optimization experts would be appreciated, of course.

NOTE:
- The source code package is significantly smaller now.  "versus.bin" was inadvertently included in the source
code package for 1.0.0.


v1.0.0 2007-10-13 
-----------------
Initial public release
